基础知识-explicit关键字

C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)
explicit关键字的作用就是防止类构造函数的隐式自动转换.

class CExample 
{ 
public: 
    CExample(void); 
public: 
    ~CExample(void); 
public: 
    int m_iFirst; 
    int m_iSecond; 
public: 
    CExample(int iFirst, int iSecond = 4); 
};  
{    
    CExample objOne; //调用没有参数的构造函数 
    CExample objTwo(12, 12); //调用有两个参数的构造函数 
    CExample objThree(12); //同上,可以传一个参数是因为该构造函数的第二个参数有默认值 
    CExample objFour = 12; //执行了隐式转换,等价于CExample temp(12);objFour(temp);注意这个地方调用了 
    //编译器为我们提供的默认复制构造函数 
}

如果在构造函数声明中加入关键字explicit,如下

explicit CExample(int iFirst, int iSecond = 4);

那么CExample objFour = 12; 这条语句将不能通过编译。

一个例子

class CxString  // 使用关键字explicit的类声明, 显示转换 
{ 
public: 
    char *_pstr; 
    int _size; 
    explicit CxString(int size) 
    { 
      
    } 
    CxString(const char *p) 
    { 
       
    } 
}; 
    // 下面是调用: 
    CxString string1(24);     // 这样是OK的 
    CxString string2 = 10;    // 这样是不行的, 因为explicit关键字取消了隐式转换 
    CxString string3;         // 这样是不行的, 因为没有默认构造函数 
    CxString string4("aaaa"); // 这样是OK的 
    CxString string5 = "bbb"; // 这样也是OK的, 调用的是CxString(const char *p) 
    CxString string6 = 'c';   // 这样是不行的, 其实调用的是CxString(int size), 且size等于'c'的ascii码, 但explicit关键字取消了隐式转换 
    string1 = 2;              // 这样也是不行的, 因为取消了隐式转换 
    string2 = 3;              // 这样也是不行的, 因为取消了隐式转换 
    string3 = string1;        // 这样也是不行的, 因为取消了隐式转换, 除非类实现操作符"="的重载 
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值