explicit关键字的使用...

 

单参数构造函数的一个隐含意思是:将该参数转换成该类的一个对象。这实际上是一个隐式的类型转换。

要注意,参数定义缺省值的构造函数只要在调用时能形成单参数形式,同样具有隐式类型转换功能。

关键字explicit用来禁止编译器隐式调用该构造函数,以防止隐式的类型转换,但对显式调用该函数则没有问题

#include "stdafx.h"
class CTest
{
public:
 //explicit CTest(char){}
CTest(char){}
};
void TestFunction(CTest anObj)
{
}

class A
{
public:
     A(int x){} //构造函数{ }
};

void f(A a)
{
}

class B {
public:
    explicit B(int i){ }
};

int _tmain(int argc, _TCHAR* argv[])
{
 TestFunction('A');
 //如果构造函数CTest(char){}前加上explicit则编译器报错,error C2664: 'TestFunction' : cannot //convert parameter 1 from 'char' to 'CTest'
 //因为编译器禁止将字符型隐式转换为CTest型。
 //如果不加explicit则编译器不报错,因为编译器会隐式调用构造函数去把char型构造成一个CTest型,
 //例如编译器可以这样做:TestFuntion(CTest(‘A’));

 A a = 4; //可以,在这里分为隐式调用构造函数>  explicit.exe!A::A(int x=4)  行   C++
          //转换为A类型的对象然后再赋值给A类型对象a

 f(123); //这里会把自动调用A的构造函数转换为A类型对象再做f的参数

// B b = 3; //B构造函数加上explicit后....error, 隐式调用构造函数失败

 B c(3); //可以

 return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sophia_sy/archive/2007/03/11/1526185.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值