• C++关键字之explicit(显式)


     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    /*
        KeyWord_explicit.cpp
        C++关键字:explicit(显示)
        Author: Michael Joessy
        Date: 2017-06-07
        Marks:
        在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。
        再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。
        但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。
        了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的;而且在编写自己的代码时也可以尝试使用。
        既然C++语言提供这种特性,我想在有些时候这种特性将会非常有用。
        按默认规定,只用传一个参数的构造函数也定义了一个隐式转换。

        原则上应该在所有的构造函数前加explicit关键字,当你有心利用隐式转换的时候再去解除explicit,这样可以大大减少错误的发生。
    */


    #include <iostream>
    using namespace std;

    class classA
    {
    public:
        classA();
        
    explicit classA(int x, int y = 23);
        ~classA();

    private:
        
    int m_x;
        
    int m_y;
    };

    classA::classA()
    {

    }

    classA::classA( 
    int x, int y /*= 23*/ )
    {
        m_x = x;
        m_y = y;
    }

    classA::~classA()
    {

    }

    int main(void)
    {
        classA ca1;
        classA ca2(
    1224);
        classA ca3(
    35);
        classA ca4 = 
    18;  // 执行了隐式转换,这个地方调用了编译器为我们提供的默认复制构造函数
                          // 对于某些类型,这一情况非常理想。
                          // 但在大部分情况中,隐式转换却容易导致错误(不是语法错误,编译器不会报错)。
                          // 隐式转换总是在我们没有察觉的情况下悄悄发生,除非有心所为,隐式转换常常是我们所不希望发生的。
                          // 通过将构造函数声明为explicit(显式)的方式可以抑制隐式转换。
                          // 也就是说,explicit构造函数必须显式调用。
        /* Error
        1>error C2440: 'initializing' : cannot convert from 'int' to 'classA'
        1>        Constructor for class 'classA' is declared 'explicit'
        */


        cin.get();
        
    return 0;
    }
  • 相关阅读:
    为or、in平反——or、in到底能不能利用索引?
    【自然框架】稳定版beta1的Demo —— 四:角色管理。另外 在线演示 终于搞定了
    【自然框架】CMS之数据库设计
    【自然框架】——重开在线演示
    刘谦魔术的一个秘密 硬币穿越玻璃的那个。
    【自然框架】PowerDesigner 格式的元数据的表结构
    【自然框架】元数据的数据库结构的详细说明和示例(一):项目描述部分
    程序员与项目经理
    Android 中文API (70) —— BluetoothDevice[蓝牙]
    Android API 中文 (50) —— SpinnerAdapter
  • 原文地址:https://www.cnblogs.com/MakeView660/p/6956054.html
Copyright © 2020-2023  润新知