zoukankan      html  css  js  c++  java
  • C++中的explicit关键字

    先看一下MSDN上关于explicit关键字的解释

    This keyword is a declaration specifier that can only be applied to in-class constructor declarations. An explicit constructor cannot take part in implicit conversions. It can only be used to explicitly construct an object.

    1 该关键字只能用来修饰类内部的构造函数

    class A
    {
    public:
        explicit A(int i):m_i(i){};
    
    private:
        int m_i ;
    };

    但是下面这样就不对了

    class A
    {
    public:
        A(int i);
    
    private:
        int m_i ;
    };
    
    explicit A::A(int i)
    {
        m_i = i ;
    }

    2 该关键字能防止隐式转换

    在C++中允许这样的操作,某个类的构造函数只有一个参数,假设类型为T,那么可以进行T到该类的对象的隐式转换,比如下面的类A的构造函数只有一个参数,类型为int,那么就可以直接将一个int转换为A类的对象,这种情况可能发生在

    • 构造A类对象时
    • 以A的对象为参数的函数调用时
    class A
    {
    public:
        A(int i):m_i(i){};
    
    private:
        int m_i ;
    };
    
    void Func(A a)
    {
        
    }
    
    int main(void)
    {
        A a1 = 1 ;    // OK, implicit convert 1 to object of A
        Func(2) ;    // OK, implicit convert 2 to object of A
        getchar() ;
    }

    不幸的是,有时这种转换会造成混淆,所以我们要阻止这种转换,这就是explicit所做的事情了,用explicit声明的构造函数不允许做这种类型的转换。如果试图转换,则会遇到下面的编译错误。

    class A
    {
    public:
        explicit A(int i):m_i(i){};
    
    private:
        int m_i ;
    };
    
    void Func(A a)
    {
        
    }
    
    int main(void)
    {
        A a1 = 1 ;    // error C2440: 'initializing' : cannot convert from 'int' to 'A'
        Func(2) ;    // 'Func' : cannot convert parameter 1 from 'int' to 'A'
        getchar() ;
    }

    ====

  • 相关阅读:
    linux API 获得文件属性
    Linux 服务端设计
    Linux C++ 使用LuaBind嵌入lua脚本
    Linux 编译安装Boost (转)
    Navicat for My SQL 查看中文乱码问题
    fastbuild联编ue4 shader的使用
    fastbuild进行ue4 shader连编
    maya 插件学习之pythonCharm和Qt环境搭建
    ue4 头发渲染
    ue4 新渲染管线整理
  • 原文地址:https://www.cnblogs.com/graphics/p/1792749.html
Copyright © 2011-2022 走看看