MOOC清华《面向对象程序设计》第4章:explicit禁止自动类型转换实验

#include <iostream>
using namespace std;

class Src;//前值类型声明,因为在Dst中要用到Src类 

class Dst{
public:
	Dst(){
		cout << "Dst::Dst()" << endl;
	}
	explicit //<1>不准用于自动类型转换 
	Dst(const Src& s){
		cout << "Dst::Dst(const Src&)" << endl;
	}
};

class Src{
public:
	Src(){
		cout << "Src::Src()" << endl;
	}
	//explicit //<2>不准用于自动类型转换 
	operator Dst() const{
		cout << "Src::operator Dst called" << endl;
		return Dst();
	}
};

void Func(Dst d){}

int main(){
	Src s;
	Dst d1(s);//这是直接构造,不能视为类型转换 
	
	//以下语句均使用了自动类型转换,当构造函数、类型转换函数 
	//均使用了explicit声明时,它们就不能用于自动类型转换了,
	//故下面的语句都不能通过编译! 
	Dst d2 = s;//ERROR!不能自动类型转换! 
	Func(s);//ERROR!不能自动类型转换!
	
	//解决问题的办法:<1>和<2>处的explicit
	//不能都去掉,也不能都保留,只留一个,就可以通过编译了 
	return 0; 
}


两处的explicit都留的话,编译器会报错,英文大意是:不能进行自动类型转换。


只留<1>处的explicit运行结果是:


只留<2>处的explicit运行结果是:


两处的explicit都不留,依然可以通过编译:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值