C++11 显式转换操作符

【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大佬

    C++11 显式转换操作符

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/325240

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午3:15
下一篇 2023年3月1日 下午3:15

相关推荐