C++中的explicit
一. C++中构造函数的隐式类型转换
- 隐式类型转换规则,遵循不损失精度的原则
- 当类类型遇到隐式类型转换的时候,会有一些意外情况产生,比如初始化一个类的对象的时候使用 = 的时候,为了避免产生这样的隐式类型转换出现了关键字explicit
ClassA a = value;
二. explicit 关键字的用法
- 在构造函数声明的时候使用,比如
class Test { int i ; public: explicit Test(int i=0):i(i){}; };
- 我们观察一下加了explicit之后定义对象过程中的变化
Test t1(1); //没有问题 Test t2 = 11; //报错!!! error: no viable conversion from 'int' to 'Test' Test t3 = t2; //没有问题 因为执行的是拷贝构造函数Test(Test& t),这个函数是没有explicit声明的
- 这个现象表示,执行Test构造函数的时候只能显性传值,不能用赋值符号的方式传递构造函数的参数
- 那有没有人问为什么 Test t3 = t2; 就可以,这里不是用赋值运算符了吗?这里调用的是拷贝赋值函数,不是我们加explicit声明的构造函数,所以这里是可以执行的。同样的如果对拷贝构造函数也加了explicit声明,Test t3 = t2; 这句也会报语法错误,只能通过Test t3(t2);这种方式拷贝构造