在C++中,explicit关键字主要用于防止隐式转换,用于修饰构造函数、复制构造函数。函数
例若有一个类:spa
class A { public: A( int count ) : m_data( count ){} private: int m_data; }; int main() { A a = 0; //ok , conver int to A a = 10; // 这里是什么操做? 等价与 a.operator=( 10 ); }
一、 A a = 0;code
首先编译器( compiler )认为这样写是不符合规矩的,由于 A = A才是正常行为可是它不放弃,经过搜索发现A能够根据一个int构造,同时这个A( int count)没有用explicit修饰过。那么A a=0编译器将自动将整形转为A类对象,实际上等同下面操做对象
A temp( 0);blog
A a = temp;ci
这里须要说明的是 A a = tmp 调用的是拷贝构造函数( copy constructor),虽然clas A中没有,可是一般不写的话,编译器会生成一个成员逐一赋值( memberwise assignment )的拷贝构造函数,底层实现一般会以memcpy进行编译器
二、a = 10;it
首先这里同构造函数同样,编译器( compiler ) 没法进行直接操做,等同于代码编译
a.operator=( 10 );class
须要注意的是, a = tmp是调用的赋值运算符( assignment操做 ), 同构造函数同样,咱们本身不写, 编译器会生成一个成员逐一赋值(memberwise assignment)操做。
三、fun( A a )
一样, fn(10)也是不对的, 可是"按照惯例", 会有:
A tmp(10);
fn( tmp ) ;
注意:拷贝构造函数的写法只能是 T::T(const T &);
而赋值运算符的写法能够多变,即以任意T为例:
能够有
T &operator = (int n);
也可有
T &operator = (const char *);
固然, 你要确认如此的定义是对T而言有意义.