• 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.

    顺序 选择 循环 总结

  • 相关阅读:
    java Spring 基于注解的配置(一)
    java Spring 在WEB应用中的实例化
    java Spring 生命周期
    java Spring bean作用域
    java Spring集合
    java Spring配置数据单元
    Velocity 入门(一)
    java strtus2 DynamicMethodInvocation配置(二)
    Android WindowManager 小结
    Android 快速选择联系人
  • 原文地址:https://www.cnblogs.com/Braveliu/p/12237127.html
Copyright © 2020-2023  润新知