C++ Explicit关键字详细解析

        知道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;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值