构造函数的二义性

本文探讨了构造函数中出现二义性的情况及其解决方法,包括如何避免因默认参数设置不当而导致的问题。同时,文中还介绍了默认构造函数与带有默认参数的构造函数的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.什么是构造函数的二义性

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返回类型的函数还是参数全部缺省了
所以规定:
当参数全部缺省时,不能带空括号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值