【C++】 error C2572: 重定义默认参数

版权声明:【fishing-pan:https://blog.csdn.net/u013921430转载请注明出处】 https://blog.csdn.net/u013921430/article/details/83025434

       

fishing-panhttps://blog.csdn.net/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)定义所有参数都有默认值得构造函数。 

 

今天根据一个问题,举一反三,又复习了其他两个内容。。

已完。。

没有更多推荐了,返回首页