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

转载于:https://www.cnblogs.com/staring-hxs/p/3702227.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值