在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
禁止自动类型转换 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!not 自动类型转化 Func(s);//errror! not 自动类型转化 //解决问题的办法:<1>和<2>c处的explicit //不能都不要(去掉),但也不能都要(保留) return 0; } 禁止自动类型转换--delete 使用=delete修饰的成员函数,不允许被调用 class T { public: T(int) { //若没有下面这条语句,则main函数中所有的语句均可以编译通过 T(char) = delete;//可以消除自动转换带来的隐患 } }; void Fun(T t) { } int main() { Fun(1); //Fun('x');自动类型转换失败(char->int),编译不通过 T ci(1); //T cc('x');自动类型转换失败,编译不通过 return 0; } //可以使用=delete删除普通函数(非成员函数) //可以消除一些自动类型转换带来的隐患 void Fun(int i) { } void Fun(char c) = delete;//显示删除char版本 int main() { Fun(1); //Fun('A');//编译不通过! return 0; }
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论