C++11——explicit关键字

explicit关键字在C++2.0之前已经有了,一般只用于修饰构造函数,用于防止隐式转换。
有一个专业术语很拗口,叫nonexplicit one argument constructor,特指只有第一个形参没有默认值,其他形参都有默认值的构造函数,拥有这类构造函数的类可以发生隐式转换。
explicit关键字就是用于修饰nonexplicit one argument constructor
隐式转换并不是不好,而是根据需求用户可以通过是否加explicit关键字来决定需要或者杜绝隐式转换。

class Complex1{
private:
	int real,imag;
public:
	Complex1(int re,int im=0):real(re),imag(im){}
	Complex1 operator+(const Complex1& x){
		return Complex1(real+x.real,imag+x.imag);
	}
};
class Complex2{
private:
	int real,imag;
public:
	Complex2(int re,int im=0):real(re),imag(im){}
	explicit Complex2 operator+(const Complex2& x){
		return Complex2(real+x.real,imag+x.imag);
	}
};
void test()
{
	Complex1 C1(1,2);
	Complex1 C11=C1+2;//这里会执行隐式转换,将2转为一个临时的Complex1类型的变量,然后执行+操作
	Complex2 C2(1,2);
	Complex2 C22=C2+2;//Error:这里无法执行隐式转换,2无法转为一个临时的Complex2类型的变量,编译报错
}

C++2.0之后拓展了explicit的功能,不只用于修饰nonexplicit one argument constructor,还可以用于修饰有多个无默认值形参的构造函数,不过一般很少使用。

class Complex1{
private:
	int real,imag;
public:
	Complex1(int re,int im):real(re),imag(im){}
};
class Complex2{
private:
	int real,imag;
public:
	explicit Complex2(int re,int im):real(re),imag(im){}
};
void test()
{
	Complex1 C1{1,2};//OK,这里编译器会形成一个initializer_list<int>,背后关联一个array<int,3>,在调用Complex1 的构造函数完成初始化时,会找到一个接受initializer_list<int>的构造函数,整包数据一起传递过去.然而这里并没有这样的构造函数,因此只能逐一从数组中取出数据赋值给构造函数的形参
	Complex1 C1={1,2};//OK,同上
	Complex2 C2{1,2};//OK,同上
	Complex2 C22={1,2};//Error,由于explicit存在阻碍了initializer_list向逐一参数的转化
}

initializer_list的讲解参考我的博客https://blog.csdn.net/qq_45311905/article/details/122009950?spm=1001.2014.3001.5501
PS:我一直以为Complex2 C2{1,2}和Complex2 C22={1,2}是一个意思,但为什么会出现上面截然相反的结构,真是百思不得其解,后面想明白了再来补充

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值