explicit构造函数之对象的隐式转换

对象的隐式转换:
对于类类型来说,非同类型的单参数构造函数定义了一条从该参数的类型向该类类型进行隐式转换的规则。
当采用单个实参的初始式时,编译器会自动根据实参的类型,调用单参数构造函数还是复制构造函数。
例如, std::string 有一个单参数构造函数 string(const char*); ,从而使得可以使用字符串字面 “hello” 直接去调用单参数构造函数,创建一个string 对象,相当于执行了string s = “hello” ,而不是去调用复制构造函数,执行了从字符串字面量对象到 string 对象的隐式转换。

void f(string s);

f("hello")

但是,在许多情况下隐式转换容易导致问题。例如,下面的代码不小 心使用 10 错误地作了一个调用 f(10) ,但是编译器不会报错。

class A{
	public:
		A(int i);
		//...
};
void f(A a);

//...
f(10);//可以运行 

为了防止这种错误,可以使用 explicit 修饰单参数构造函数,要求使用 值进行单参数初始化时,只能作复制初始化,禁止实参到对象的隐式转换

class A{
	public:
		explicit A(int i);
		//...
};
void f(A a);
//...
f(10);//错误 
f(A{5});//可以运行 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗吧!骚年!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值