• C++ explicit 用法


    引言

    本文介绍了 C++ 中 explicit 关键字的用法.

    原文地址: C++ explicit 用法

    欢迎访问我的博客: http://blog.duhbb.com/

    explicit 作用

    在 C++中, explicit 关键字用来修饰类的构造函数, 被修饰的构造函数的类, 不能发生相应的隐式类型转换, 只能以显式的方式进行类型转换.

    explicit 使用注意事项:

    1. explicit 关键字只能用于类内部的构造函数声明上.
    2. explicit 关键字作用于单个参数的构造函数 (多个参数也适用, 但必须只有一个参数需要赋值, 其他的参数有默认值).
    3. 在 C++ 中, explicit 关键字用来修饰类的构造函数, 被修饰的构造函数的类, 不能发生相应的隐式类型转换.
    4. it cannot be used for implicit conversions and copy-initialization

    多个参数的情况

    其实对于上面的第二点我是存疑的, 因为 CPP Reference explicit specifier 中的例子表明 explicit 是可以用于多个参数的.

    例子

    例 1 基础例子

    #include <bits/stdc++.h>
    using namespace std;
    
    
    class Test1 {
    public:
    
        Test1(int n) {
            m_num = n;
        }
    
    private:
        int m_num;
    };
    
    
    class Test2 {
    public:
        explicit Test2(int n) {
            m_num = n;
        }
    
    private:
        int m_num;
    };
    
    int main() {
    
        Test1 t1 = 12;              // 隐式调用构造函数成功
        Test2 t2 = 12;              // 编译错误, 不能隐式调用其构造函数
        Test2 t2(12);               // 显式调用成功
    
        return 0;
    }
    

    例 2 CPP Reference 中的例子

    下面是 CPP Reference explicit specifier 中的例子, 感觉更全面一点:

    struct A
    {
        A(int) { }      // converting constructor
        A(int, int) { } // converting constructor (C++11)
        operator bool() const { return true; }
    };
    
    struct B
    {
        explicit B(int) { }
        explicit B(int, int) { }
        explicit operator bool() const { return true; }
    };
    
    int main()
    {
        A a1 = 1;      // OK: copy-initialization selects A::A(int)
        A a2(2);       // OK: direct-initialization selects A::A(int)
        A a3 {4, 5};   // OK: direct-list-initialization selects A::A(int, int)
        A a4 = {4, 5}; // OK: copy-list-initialization selects A::A(int, int)
        A a5 = (A)1;   // OK: explicit cast performs static_cast
        if (a1) ;      // OK: A::operator bool()
        bool na1 = a1; // OK: copy-initialization selects A::operator bool()
        bool na2 = static_cast<bool>(a1); // OK: static_cast performs direct-initialization
    
    //  B b1 = 1;      // error: copy-initialization does not consider B::B(int)
        B b2(2);       // OK: direct-initialization selects B::B(int)
        B b3 {4, 5};   // OK: direct-list-initialization selects B::B(int, int)
    //  B b4 = {4, 5}; // error: copy-list-initialization does not consider B::B(int,int)
        B b5 = (B)1;   // OK: explicit cast performs static_cast
        if (b2) ;      // OK: B::operator bool()
    //  bool nb1 = b2; // error: copy-initialization does not consider B::operator bool()
        bool nb2 = static_cast<bool>(b2); // OK: static_cast performs direct-initialization
    }
    

    总结

    C++ explicit 还是比较好理解的, 主要就是避免隐式转换, C++ 中的转化真的是太灵活了, 容易搞出 bug 来.

    原文地址: C++ explicit 用法

    欢迎访问我的博客: http://blog.duhbb.com/

  • 相关阅读:
    第二十三章 Centos7下Docker安装kibana
    第十七章 Ansibleplaybook模板部署wordpress
    第二十一章 Centos7下Docker自定义配置
    第十八章 AnsibleplaybookRole基础介绍
    第二十二章 Centos7下Docker安装Elasticsearch
    第二十一章 Centos7下Docker安装Nginx
    第二十章 Centos7下Docker安装Tomcat
    第十九章 AnsibleplaybookRole重构wordpress
    第十六章 Ansibleplaybook模板化(Jinja2)
    ABC233
  • 原文地址:https://www.cnblogs.com/tuhooo/p/16421595.html
Copyright © 2020-2023  润新知