【1】显式转换操作符
C++11以前,对explicit关键字的理解可参考随笔《explicit关键字》。
而在C++11中,标准将explicit的使用范围扩展到了自定义类型转换操作符上,以支持所谓的“显式类型转换”。
explicit关键字作用于类型转换操作符上,意味着只有在直接 构造目标类型 或 显式类型转换 时可以使用该类型。
理论概念总是让人“费解”的,看看如下应用示例:
1 #include <iostream> 2 using namespace std; 3 4 class ConvertTo 5 { 6 }; 7 8 class Convertable 9 { 10 public: 11 explicit operator ConvertTo () const 12 { 13 cout << "callCount : " << ++(m_nCallCnt) << endl; 14 return ConvertTo(); 15 } 16 17 static int m_nCallCnt; 18 }; 19 20 int Convertable::m_nCallCnt = 0; 21 22 void Func(ConvertTo ct) { } 23 24 int main() 25 { 26 Convertable c; 27 ConvertTo ct(c); // 直接初始化,通过 28 // ConvertTo ct2 = c; // 拷贝构造初始化,编译失败 29 ConvertTo ct3 = static_cast<ConvertTo>(c); // 强制转化,通过 30 // Func(c); // 拷贝构造初始化,编译失败 31 system("pause"); 32 }
定义了两个类型ConvertTo和Convertable。Convertable类定义了一个显式转换到ConvertTo类型的类型转换符。
那么对于main中ConvertTo类型的ct变量而言,由于其直接初始化构造于Convertable变量c,所以可以编译通过。
而做强制类型转换的ct3同样通过了编译。
但是ct2由于需要从c进行拷贝构造初始化,因而不能通过编译。
此外,调用函数Func时,传入Convertable类型的变量c,也会导致实参进行拷贝构造初始化,因此也不能通过编译。
good good study, day day up.
顺序 选择 循环 总结
原文链接: https://www.cnblogs.com/Braveliu/p/12237127.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/325240
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!