码迷,mamicode.com
首页 > 编程语言 > 详细

C++11 显式转换操作符

时间:2020-01-27 23:40:22      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:div   code   目标   namespace   变量   类型   ret   hive   title   

【1】显式转换操作符

以前对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.

顺序 选择 循环 总结

C++11 显式转换操作符

标签:div   code   目标   namespace   变量   类型   ret   hive   title   

原文地址:https://www.cnblogs.com/Braveliu/p/12237127.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!