首页 > 代码库 > explicit浅谈

explicit浅谈

在C++中,explicit关键字主要用于防止隐式转换,用于修饰构造函数、复制构造函数。

例如有一个类:

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 );
} 

1、 A a = 0;

首先编译器( compiler )认为这样写是不符合规矩的,因为 A = A才是正常行为但是它不放弃,通过搜索发现A可以根据一个int构造,同时这个A( int count)没有用explicit修饰过。那么A a=0编译器将自动将整形转为A类对象,实际上等同下面操作

A temp( 0);

A a = temp;

这里需要说明的是 A a = tmp 调用的是拷贝构造函数( copy constructor),虽然clas A中没有,但是通常不写的话,编译器会生成一个成员逐一赋值( memberwise assignment )的拷贝构造函数,底层实现通常会以memcpy进行

 

2、a = 10;

首先这里同构造函数一样,编译器( compiler ) 无法进行直接操作,等同于代码

a.operator=( 10 );

需要注意的是, a = tmp是调用的赋值运算符( assignment操作 ), 同构造函数一样,我们自己不写, 编译器会生成一个成员逐一赋值(memberwise assignment)操作。

 

3、fun( A a )

同样, fn(10)也是不对的, 但是"按照惯例", 会有:
A tmp(10);
fn( tmp ) ;

 

注意拷贝构造函数的写法只能是 T::T(const T &);

而赋值运算符的写法可以多变,即以任意T为例:

可以有

T &operator = (int n);
也可有
T &operator = (const char *);

当然, 你要确认如此的定义是对T而言有意义.