知道C++中有Explicit关键字,但对其用法和作用的理解有些模糊,今天有时间给系统的澄清一下:
explicit关键字用来修饰类的构造函数,表明构造函数是显示的,相对的是implicit关键字。首先这个关键字只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上,它的作用是不能进行隐式转换。
用法代码如下:
class CPerson
{
public:
CPerson(int height):m_height(height)
{
}
private:
int m_height;//身高
};
int _tmain(int argc, _TCHAR* argv[])
{
CPerson person;//错误,没有默认构造函数
CPerson person1(160);//正确
CPerson person2 = 175;//正确
person1 = 170;//正确
person2 = 178;//正确
return 0;
}
CPerson person2 = 175;这行代码正确,这是因为编译器默认情况下有隐式转换的功能,把其转换为CPerson person2(175);如果不允许这种形式的转换,那么explicit关键字就派上用场了。
class CPerson
{
public:
explicit CPerson(int height):m_height(height)
{
}
private:
int m_height;//身高
};
int _tmain(int argc, _TCHAR* argv[])
{
CPerson person;//错误,没有默认构造函数
CPerson person1(160);//正确
CPerson person2 = 175;//错误
person1 = 170;//错误,关键字explicit取消了隐式转换功能
return 0;
}
此时,再次编译的话,编译器会提示错误:error C2440: “初始化”: 无法从“int”转换为“CPerson” class“CPerson”的构造函数声明为“explicit”,从错误提示可以看出,这个关键字的作用就是将编译器隐式转换功能给屏蔽掉。
例外:当构造函数有2个以上的参数时,自动取消隐式转换,但有一种情况例外,构造函数参数有默认值,示例代码如下:
class CPerson
{
public:
CPerson(int height, int weight = 0):m_height(height),m_weight(weight)
{
}
private:
int m_height;//身高
int m_weight;//体重
};
int _tmain(int argc, _TCHAR* argv[])
{
//CPerson person;//错误,没有默认构造函数
CPerson person1(160);//正确
CPerson person2 = 175;//正确
return 0;
}