zoukankan      html  css  js  c++  java
  • 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.

    顺序 选择 循环 总结

  • 相关阅读:
    ubuntu set/unset proxy
    Caffe Ubuntu14.04 64位 的最快安装 (cuda7.5 + cudnn7.0 2016最新)
    OpenCV3.0.0+win10 64位+vs2015环境的下载,安装,配置
    Hadoop学习第一天
    PDF在xp或2003下正常在win7下乱码的问题
    android入门到熟练(五)---广播
    android入门到熟练(三)----UI界面
    android入门到熟练(二)----活动
    android入门到熟练(一)
    jQuery慢慢啃之回调(十三)
  • 原文地址:https://www.cnblogs.com/Braveliu/p/12237127.html
Copyright © 2011-2022 走看看