C++中的explicit关键字

http://www.cnblogs.com/graphics/archive/2010/08/05/1792749.html


C++中的explicit关键字

先看一下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类的对象,这种情况可能发生在

构造A类对象时

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值