码迷,mamicode.com
首页 > 其他好文 > 详细

explicit浅谈

时间:2014-05-01 03:03:36      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:com   http   blog   style   class   div   img   code   c   java   log   

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

例如有一个类:

mamicode.com,码迷
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 );
} 
mamicode.com,码迷

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而言有意义.

explicit浅谈,码迷,mamicode.com

explicit浅谈

标签:com   http   blog   style   class   div   img   code   c   java   log   

原文地址:http://www.cnblogs.com/staring-hxs/p/3702227.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!