1.隐式转换2.explicit1.隐式转换隐式转换是编译器自动完成的类型转换,无需程序员显式指定;对于类类型来说,核心触发场景是:a.类拥有单参数构造函数 b.第一个参数外,其余参数都有默认值的构造函数 编译器会利用这个构造函数,将参数类型的值隐式转换为类对象#include iostream#include stringusingnamespacestd;// 定义一个简单的包装类classMyString{private:stringstr;public:// 单参数构造函数const char* - MyStringMyString(constchar*s):str(s){cout构造函数const char* - MyStringendl;}voidprint(){cout内容strendl;}};// 测试函数参数为MyString类型voidshowString(MyStrings){s.print();}intmain(){// 场景1直接用const char*赋值给MyString对象隐式转换MyStrings1hello;// 编译器自动调用MyString(hello)// 场景2函数参数期望MyString传入const char*隐式转换showString(world);// 编译器自动将world转换为MyString(world)return0;}2.explicitexplicit关键字的核心作用是:修饰类的构造函数(C11后也可修饰转换函数),禁止编译器对该构造函数进行隐式转换,只 能通过显式方式创建对象1).构造函数加上explicit#include iostream#include stringusingnamespacestd;classMyString{private:stringstr;public:// 加explicit禁止隐式转换explicitMyString(constchar*s):str(s){cout构造函数const char* - MyStringendl;}explicitMyString(intn):str(to_string(n)){}voidprint(){cout内容strendl;}};voidshowString(MyStrings){s.print();}intmain(){// ❶ 错误隐式转换被禁止// MyString s1 hello; // 编译报错无法从const char[6]转换为MyString// ❷ 正确显式构造直接调用构造函数MyStrings1(hello);s1.print();// ❸ 错误函数参数的隐式转换被禁止// showString(world); // 编译报错无法将参数从const char[6]转换为MyString// ❹ 正确显式转换强制调用构造函数showString(MyString(world));// 或C风格的强制转换showString(static_castMyString(123));return0;}2).explicit修饰转换函数(operatorT())classMyInt{private:intval;public:MyInt(intv):val(v){}// 显式转换为int禁止隐式转换explicitoperatorint()const{returnval;}};intmain(){MyIntnum(10);// 错误隐式转换被禁止// int a num;// 正确显式转换intbstatic_castint(num);return0;}