一.什么是构造函数的二义性
1.默认构造函数
定义类对象时没有显示的提供初始化式时系统自动调用的构造函数;
(注意:一个类显式地声明了任何构造函数,编译器不生成公有的默认构造函数)所以只要显示的定义构造函数,系统就不会生成默认的构造函数。
2.二义性的产生
class Complex
{
public:
Complex();
Complex(int r = 0); //带有默认值的构造函数(不是默认构造函数)
Complex(int r = 0, int i = 0); //同上
};
。。。。。
Complex tcomplex; //产生二义性
产生二义性的原因:
带有默认值的形式参数,参数传递时实参可以省略对应的值(参数缺省),这就带来了一个问题就是:编译器不知道你在传参数的时候是缺省了还是想调用无参的构造函数,造成二义性;
3.解决办法
重载无参的构造函数和缺省参数造成的二义性 | 改变传参数个数或者删掉其中几个 |
不同参数的缺省参数造成的二义性 | 改变传参数个数或者删掉其中几个 |
其他组合同理。。。。。
二.默认参数为0的构造函数和无参构造函数
class test
{
public:
test();
test(int r = 0);
};
。。。。。
test test1;
//产生二义性 同理,再次不赘述
class test
{
public:
test(int r = 0);
};
。。。。。
test test1;
//可以调用,认为参数缺省了
class test
{
public:
test(int r = 0,int k=1);
};
。。。。。
test test1;
//可以调用,认为两个参数都缺省了
//**********************************************************************************************//
注意:
当参数列表的所有形参都有默认值的时候,调用时实参全部或者部分都可缺省,当全部缺省时,切记不要带参数的空括号();比如上述两个参数全部缺省了,写成如下:
test test1(); //错误,产生歧义,是定义了一个test返回类型的函数还是参数全部缺省了,
所以规定:
当参数全部缺省时,不能带空括号。