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

来源:互联网 发布:软件测试项目计划书 编辑:程序博客网 时间:2024/06/07 06:48
#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都不留,依然可以通过编译:


阅读全文
0 0