【fishing-pan:https://blog.youkuaiyun.com/u013921430转载请注明出处】
前言
当debug时遇到这个错误C2572: “XXXX”: 重定义默认参数,往往是因为在函数的声明和定义中同时给参数设定了默认值。想修改这个错误,你只需将函数的定义中的形参默认值部分删除即可。(注:不是删除形参,而是删除默认值部分)例如以下这种情况,编译器就会报错;
Student(int a , char *n = "default name"); //函数声明
Student::Student(int a, char *n = "default name" ) //函数定义
{
/*函数实现*/
}
修改后的代码如下;这样程序就能正常运行了。
Student(int a , char *n = "default name"); //函数声明
Student::Student(int a, char *n ) //函数定义
{
/*函数实现*/
}
问题分析
这个错误并不是什么大问题,因为在写代码的过程中,为了省事,大家都会习惯性的把函数的声明直接粘贴到函数的定义处。至于说为什么不能在函数的声明和定义处同时给形参以默认值,我查阅了一些书籍都没有给出明确的解释。大家只需记住即可。(OS:这根本就不算分析好吗?)
我又好奇的想了一下,能不能在函数的声明中不给予形参默认值,而在定义中给予默认值呢?所以我又试了一下。测试是在VS2013下进行的。测试结果是也可以运行。但是我又在另一种情况下进行了测试,发现无法运行。下面这种情况中就不可以,因为main() 函数调用func() 函数时,根据函数声明,形参并没有默认值,所以调用函数时,不能使用缺省的参数值。
int func(int a);
void main()
{
int aa = func(5);
int bb = func(); //报错
cout << aa<<" ";
cout << bb;
system("pause");
return;
}
int func(int a=3 )
{
a += a;
return a;
}
引申
再引申一下,在类中,如果你想定义一个构造函数,并且将某一构造函数中的所有形参都设定默认值,这样做会发生什么呢?
Student(){ age = 20; name = "default name"; } //不带形参的默认构造函数
Student(int a = 20, char *n = "default name"); //形参有默认值的默认构造函数
答案是你使他变成了一个默认构造函数;
Student NI; //报错,定义了多个默认构造函数
为什么会变成默认构造函数呢?我们来看看上面的报错:因为NI这个对象时没有给定初始化参数,所以应该调用没有参数的构造函数,也就是默认构造函数。而在第二个构造函数中所有的参数都有默认值,所以NI也能调用他,所以其实他也是默认构造函数,只是说这个默认构造函数也可以初始化带数据的对象。这就是为什么这两种方式都是定义的默认构造函数的原因。
所以在C++中有两种方式的默认构造函数
1)定义一个无参数的构造函数;
2)定义所有参数都有默认值得构造函数。
今天根据一个问题,举一反三,又复习了其他两个内容。。
已完。。