zoukankan      html  css  js  c++  java
  • [018]C++ explicit构造函数

    explicit

    [英][ɪkˈsplɪsɪt][美][ɪkˈsplɪsɪt]

    adj.明确的,清楚的; 直言的; 详述的; 不隐瞒的; 

    看到上面的英文解释,我们应该就知道explicit构造函数是什么意思了:显式的构造函数!

    一、隐式构造函数

    如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:

    class Myclass {
    public:
        Myclass(int num){};
    };

    如果我们执行这样的操作,就相当于自动将整型转换为MyClass类对象

    MyClass obj = 10; //ok,convert int to MyClass 

    它与下面的代码相等:

    MyClass temp(10);  
    MyClass obj = temp; 

    二、显示构造函数

    虽然隐式转换很方便,但是在有些时候,我们可能不需要这些隐式转换,比如:

    1 class Myclass {
    2 public:
    3     Myclass(int num) {                       // 输出数字
    4         cout << num <<endl;
    5     }
    6     Myclass(const char* p) {                 // 输出字符
    7         cout << *p << endl;
    8     }
    9 };

    如果我们按照下面的方式来定义:

    Myclass obj2(2);
    Myclass obj3 = Myclass("b");

    这样会各自调用各自的构造函数来进行打印,分别输出“2”和“b”。

    但是如果我们继续按照隐式转换的方式来写:

    Myclass obj = 10;
    Myclass obj1 = 'a';

    虽然都会编译通过,但是会被隐式转换,obj1最后打印输出了b的ASCII码。

    为了避免上面的情况的错误发生,我们可以声明显示的转换,使用explicit 关键字:

    1 class Myclass {
    2 public:
    3     explicit Myclass(int num) {
    4         cout << num <<endl;
    5     }
    6     Myclass(const char* p) {
    7         cout << *p << endl;
    8     }
    9 };

    这样下面的写法:

    Myclass obj = 10;                   // 编译不通过
    Myclass obj1 = 'a';                 // 编译不通过
    Myclass obj2(2);                    // OK
    Myclass obj3 = Myclass(2);          // OK 
  • 相关阅读:
    docker 单kafka ,多分区
    spring data jpa + mysql使用json 类型
    C++ Multithread Tutorial
    GDB 调试程序
    C++ Project 积累(四)
    GDB 调试 C/C++ Project
    makefile 学习(一)
    Ubuntu 下配置 boost + eclipse
    C++ Project 积累(3)
    Leetcode Sudoku Solver
  • 原文地址:https://www.cnblogs.com/hustcser/p/4172192.html
Copyright © 2011-2022 走看看