- explicit是在类里面声明构造函数的,它的作用是可以防止对象间的隐式转换。被声明为explicit的构造函数通常比其非explicit更受欢迎,因为它们禁止编译器执行非预期的类型转换。除非有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。
- 例如:
- class Dog
- {
- public:
- Dog() {}
- /* explicit */ Dog(int i) {}
- void func(Dog dog)
- {
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- Dog dog;
- dog.func(10); //ok,因为构造函数没有添加explicit
- /*
- ** 上面的语句等于
- ** Dog temp(10);
- ** Dog dog = temp;
- */
- //当构造函数添加上了explicit的时候,
- //上面的函数调用就会发生错误,因为
- //explicit关键字禁止了对象之间的隐式转换
- //即禁止产生临时对象。
- //解决办法可以这样:dog.func(Dog(10));
- system("pause");
- return 0;
- }