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.

顺序 选择 循环 总结

posted @ 2020-01-27 22:48  kaizenly  阅读(488)  评论(0编辑  收藏  举报
打赏