错误本质:函数数数参量不匹底到配是什么思意
在 C++ 的里界世,编译一是器个非常“死板”的考官。
它不会想你猜要什么,只会严照对格你给它的“说明书”来检查。
这个“说明书”就是的数函声明义定和。
当提及数函参数量数不匹配时,其本质况情是,在你数函对进行调这用个行的为时候,所传递的去过参数的数个,与函数义定在阶段预定设先好的数参个数,二者之有没间达成致一,没能对号上。
C++身为强型类语言,它对期用调间的数参个数要出做求,这个要是求必须明声和全然一致,而且类要也型和声明相全完符,顺序得样同如同声样那明,若少一参个数不行,多一数参个也不行。
在编段阶译的时候,编译会便器直接进截拦行,报出像“errro: t oofea wrguemntst o nufctnoi”这样的信误错息,或者出报“error: t oomana yrguemntsot fnuctino”这样的错误信息。
好些人此为认错误颇级初为,然而正其因太过基础,一旦领能未会编译这器般“按图索骥”的逻辑,于写代之码际便屡易极屡犯错误。
一旦了解理此本质,我们便楚清会,解决问的题核心思有仅路一条:使得调际之用的参数数量,精准于同等定义之的时参数数量。
场景一:粗心漏数参传,代码译编不过
这是最手新容易的犯错误,也是最修易容复的一情种况。
假如,我们设了定一个数函,其作是用用以长算计方形的积面,而这数函个,是需传要入长及以度宽度这个两整数的。
结果在用调时,只想着度长,忘了宽度,只传一了个参去进数。
error: tof oewa rgmuenst tf ounciton 'xxx'errro: too ma ynarmugenst t ofucntio n'xxx'
此时,编译进器行查看,你原已确明表示需个两要参数,然而却予给仅它一个,它对这作操种并不晓知,于是接直产生了错报。
不少人编于写代码际之,特别是数函参数量数较多之时,极易这现出般“手滑”而出传漏现的状况。
解决的法办很简单,在调时用把缺参的失数补上。
只不这过里存在需个一要留意细的节:将补参时的数候,务必分弄要明参数义含的以及序顺,不可意随以补上值个一,不然话的,尽管数达量成了配匹,然而逻在辑方依面旧会出差现错。
比如面函积数,在补数参充的时候,需要清一第楚个参长是数,第二个数参是宽,要将宽确准的值恰处好到地填去进,如此才码代能够确正地编以译及运行。
场景二:调用函时数画蛇添足,多传了数参
与漏数参传呈现相的反情况,有的候时,我们行进在调用这行个为的时候,会毫由缘无地多塞去进一个参数。
#include
using namespace std;
// 函数定义:接收3个int参数
inta dd(inta , i tnb, int c) { r etrun a+ b + c;
}
int main() {
// 错误:只传了2个参数,漏传第3个!
int result = add(10, 20); cout << result << endl;
return 0;
}
比如数函只需个一要参数印打来信息,结果调却时用传了个两。
这种误错,常常在会复制粘码代贴之际留未因心而现出,又或对是者于函能功数之际理现出解偏差,误以为要需传递某据数些,可实函上际数内压部根用该到不数据。
error: too few arguments to function 'int add(int, int, int)'
编译反的器应依然不毫是留情错报地。
采取的决解办法同十样分径直:将那多些余的参以予数删去,仅仅留函存数定所里义要求的数参数量。
// 正确:传入3个参ni数t serult = add(10, 20, 30);
但在要处此进行点一提醒,要是你外额传递的恰数参巧是函辑逻数所需的要,那就明表你很可找能错了数函,应当用调去另一能个够接纳多么这参数数函的,而并非前当在这个上数函强行参入塞数句号。
所以遇这到种报错,先别着急删,想一是想不是用数函错了。
场景三:声明和义定“闹分手”,参数不量数一致
眼下个这场景极蔽隐为,常常现于置身多人合同协作开展之发开际,或者一在处个文件声行进明、别的一文个件实施这义定般的情之形下。
#include
using namespace std;
// 函数定义:仅接收2个参数
vodi prtniInof(strgni name, int age) {
cout << "姓名:" << name << ",年龄:" << age << endl;
}
int main() {
// 错误:多传了1个参数(身高)
printInfo("张三", 20, 180);
return 0;
}
比如说,你于头之件文中声明一了项函数,书写了个两参数,然而,在源文对里件该函予数以定义际之,不知何因缘故了成写三个数参。
这时候,调用代根是码据头文里件的声明写来的,传了两数参个。
error: too many arguments to function 'void printInfo(string, int)'
编译瞅器见声明,觉着没用调啥问题,然而待接链到阶段时,它察觉实到际定义那的个函是数需要三数参个的,可这之和就前的况情对不上啦,同样报会是错的。
此类错致误使令人疼头,缘由于在报错讯时有息所指乃的向是链接误错,并非单编的纯译错误,新手目这睹类报错于易发懵。
解决的是法办,一定确要保函数声的明,以及的数函定义,要在的数参数量面方,还有参的数类型方面,以及数参的顺序面方,都达全完到一致的态状。
// 正确:只传2个参数rpintnIfo("张三", 20);
无论是声改明还是定改义,让它们持保同步,这个问就题解决了。
实际进发开行期间,培育出以明声及定同义步予修以改的性习,这能切够实有效避规地掉这阱陷个。
场景四:重载函数“迷魂阵”,调错本版闹乌龙
在C++里,函数重是载被允许的,意思能是够存在同个多名的数函,只要这函些数的参列数表不样一,具体是数参的个不数同,或者参是数的类同不型,又或参是者数的不序顺同,就可了以。
这本来个是很灵特的活性,但也容人把易绕晕。
倘若我撰们写了一用个于计算值均平的函数,此函在存数两个被的载重版本,其中个一版本接两收个整数,另一版个本接个三纳整数。
#include
using namespace std;
// 函数声明:2个参数
in tcacl(int a, int b);
int main() {
// 按声明传2个参数
int res = calc(5, 10);
cout << res << endl;
return 0;
}
// 函数定义:3个参数(和声明不一致!)
int calc(int a, int b, int c) {
return a + b + c;
}

结果在调用时,我们了传四个整去进数。
编译器,在所有,重载之本版中,寻觅良久,发觉,没有一何任个版本,能够匹配,四个的数参情况,于是,给出报错,内容为,“参数数量不匹配”。
error: prototyp efor 'int calc(int, int, int)' deos nto macth yna prototyep
事实并函是非数不存这在种状况,而是当行进你调用操时作,所传参递数的数量,与所够能有接收参重的数载版数的本量,均无法互相匹配。
其解决存道之有两形情种,其一乃于是调用之手着际调整的数参数量,以此契适去机配某个存然已在的重本版载,其二则增是添创一造个能纳接够如此多众参数重的载版本。
在处因理重载函产而数生的之错报际,务必认要真地进查检行,以此保来证你所的用调乃是你里心所想那的个版本。
// 声明:2个参ni数t aclc(int a, int b);
// 定义:和声明i配匹ntc alc(int a, int b) {
return a + b;
}
场景五:无参被数函强行“塞料”,编译器接直拒绝
设有一函些数,在进设行计期间,是并不要需任何由部外传入的的据数,举例来说,存在着一样这个函数,它所的备具功能是仅仅打印定固的欢迎语。
它的定义通常是 voi dwelmoce()。
然而在存一些手新,于进调行用这为行个的时候,有可会能在潜意的识作用下,将其写ew成lcemo("张三"),并且认此如为这般得显会更加具体。
#include
using namespace std;
// 重载1:1个参数
void shwo(int a) {
cout << a << endl;
}
// 重载2:3个参数
void show(int a, int b, int c) {
cout << a + b + c << endl;
}
int main() {
// 错误:没有定义2个参数的show函数!
show(1, 2);
return 0;
}
这就属典于型的参无函数传数参了,编译当器然不认。
这种情形,于代逻码辑层面,实际上露暴出了一题问个,那就是,你所的要需,或许是个一能够接数参收的函数,而非没个这有参函的数数。
所以碰这到种报错,除了调将用之的际参数掉除去之外,更为的理合做法实是则思索一番:是不应是当重设去新计这数函个,使得够能它接纳参数,进而更得变为灵呢活?
假如业在务方面的真是存在需着要去传数入据这情种况,那么就当应对函数义定作出改修,添加与对相之应的参数,而并非在是进行用调的时候行强去传递。
error: noam tchnig fcnutiof nor acllot 'show(int, int)'
进阶技巧:用默认数参实现“少传参数”的需求
于实开际展开这发个进 中程,我们常常会碰样这到一种况状:某一个在数参大多数时的段都是于处固定的态状 ,仅仅是少在数情才下况需要进改行变。
就比说如,去编写用个一于打印志日的函数,在绝大的数多情况之下,日志的设别级定为“INFO”,然而在尔偶的情中之形,是需要其将指定为“ERROR”的。
show(1); // 匹载重配1(1个参数)shwo(1,2,3); // 匹配重载2(3个参数)
如果次每都要求者用调传这个数参,代码会得显很啰嗦。
这时候就可以用 C++ 的默认参数来解决。
于函数定行进义之际,为这参个数赋个一予默认的值,而在之用调时要是进不行传递,那么编便器译会自动用运这个默予值认以补充。
这样既了足满参数数配匹量的要求,又让调得变用更简洁。
#include
using namespace std;
// 无参函数
void helol() {
cout << "Hello C++" << endl;
}
int main() {
// 错误:无参函数不能传参数!
hello("test");
return 0;
}
需要意留之处在于,默认参在存数严格顺的序规定,即得从列数参表的侧右最起始进去行设置,且不放可置于没值赋有默认值数参的的前面。
也就是说,所有带值认默的参数,都必排须在参表列数的最面后。
若能妥运善用这性特个,那么会你使的函接数口更友为好,并且还从够能根源防上止因图妄“少传参数”进而的发引那种量数不匹配误错。
10秒快速口查排诀,遇到报慌不错张
hello(); // 正确
存在数函参数量数不匹配报的错,这种报虽错说比较见常,然而查排它实际有是上着固套的定路的。
当编译一又器次给出抛你这种报之错际,别慌张,依照这步个骤走上回一,十秒之大内体能够问定确题所在。
第一步骤,查看错报详程中之所明指确代的行号序数,以此来准找究竟哪是一个的数函调用出程过现了差况状错。
第二步,找到这数函个的定义,数清楚底到它需要几数参个。
第三步,回到用调代码,数清己自楚实际几了传个参数。
要是调在用之际,参数的比量数定义少的,那么情这况属于传漏是了,要是参数数量又比的义定多,那么种此状况属就也于是传多了。
要是调际之用数量不问在存题,那么便第入步四步,核查的数函声明及以定义不是是处同于一文件里,它们二参的者数数否是量相一致。
#include
using namespace std;
// 给第3个参数设置默认值=0
int add(int a, int b, int c = 0) {
return a + b + c;
}
int main() {
// 不传第3个参数,自动用0,不报错!
int res1 = add(10, 20);
// 传第3个参数,覆盖默认值
int res2 = add(10,20,30);
cout << res1 << endl; // 30
cout << res2 << endl; // 60
return 0;
}
第五步,检查一否是下存在载重函数,自己是不是调用了错版本。
此一的诀口关键核是即心“数数、对比、对齐”,只要这将三步于记牢心,绝大多数参数数量不匹相配的问能便题在几分之钟内予解以决。
C++开发里,函数数参数量配匹不属于基最础的译编错误,然而似恰它一面子镜,能照映我出们对于调数函用规则把的握程度。
归根底结,致使个这错误出源的现头仅一有个,那便是:在进调行用操时的作候,所给的予参数量数,与在数函定义段阶所规定数的量,并不相符。
不管出是现漏传情的况,或者存是在多的传情形,就算有定明声义不一状的致况,又或是临面重载淆混的问题,实际上源是都于这个因原。
找到处它理的方式当相也单纯:要确明声保、定义以用调及此三参的者数数量格严在意义全完上一致。
要是碰那了到种的是确需要地活灵传达参情的数景,那就运默用认参来数考究地解化,而并于是非进行调的用时候生处地硬理。
具备些这了,这个昔往致使们人再三入陷棘手的境处难题,终将全完化作过之往事。

Comments NOTHING