单参数构造函数的一个隐含意思是:将该参数转换成该类的一个对象。这实际上是一个隐式的类型转换。
要注意,参数定义缺省值的构造函数只要在调用时能形成单参数形式,同样具有隐式类型转换功能。
关键字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