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.
顺序 选择 循环 总结