本文共 1286 字,大约阅读时间需要 4 分钟。
先看一下MSDN上关于explicit关键字的解释
This keyword is a declaration specifier that can only be applied to in-class constructor declarations. An explicit constructor cannot take part in implicit conversions. It can only be used to explicitly construct an object.
1 该关键字只能用来修饰类内部的构造函数
class A{public: explicit A(int i):m_i(i){};private: int m_i ;};
但是下面这样就不对了
class A{public: A(int i);private: int m_i ;};explicit A::A(int i){ m_i = i ;}
2 该关键字能防止隐式转换
在C++中允许这样的操作,某个类的构造函数只有一个参数,假设类型为T,那么可以进行T到该类的对象的隐式转换,比如下面的类A的构造函数只有一个参数,类型为int,那么就可以直接将一个int转换为A类的对象,这种情况可能发生在
class A{public: A(int i):m_i(i){};private: int m_i ;};void Func(A a){ }int main(void){ A a1 = 1 ; // OK, implicit convert 1 to object of A Func(2) ; // OK, implicit convert 2 to object of A getchar() ;}
不幸的是,有时这种转换会造成混淆,所以我们要阻止这种转换,这就是explicit所做的事情了,用explicit声明的构造函数不允许做这种类型的转换。如果试图转换,则会遇到下面的编译错误。
class A{public: explicit A(int i):m_i(i){};private: int m_i ;};void Func(A a){ }int main(void){ A a1 = 1 ; // error C2440: 'initializing' : cannot convert from 'int' to 'A' Func(2) ; // 'Func' : cannot convert parameter 1 from 'int' to 'A' getchar() ;}
====
本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2010/08/05/1792749.html,如需转载请自行联系原作者