美文网首页
C++隐式类型转换的问题及explicit关键字

C++隐式类型转换的问题及explicit关键字

作者: 突击手平头哥 | 来源:发表于2019-10-23 20:24 被阅读0次

    C++隐式类型转换的问题

    什么是隐式类型转换?

    可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。

      隐式类型转换指的是, 假设一个类的构造函数只有一个参数(或者除第一个以外都有默认值); 我们可以进行一个从构造参数类型到该类类型的编译器自动转换

    代码

    class A
    {
    public:
        A(int a) {
            printf("%s\n", "构造函数");
        }
    };
    
    void fun(A a)
    {
    
    }
    
    int main()
    {
        A a = 3;
        fun(1);
        return 0;
    }
    

    fun函数的参数是A, 但是因为我们存在一个以int类型的构造函数, 所以会进行一次隐式转换
    这里的隐式转换并没有什么问题, 但是这种由编译器进行的隐式的转换, 如果非必要应当禁止

    explicit关键字

    class A
    {
    public:
        explicit A(int a) {
            printf("%s\n", "构造函数");
        }
    };
    
    void fun(A a)
    {
    
    }
    
    int main()
    {
        A a = 3;
        fun(1);
        return 0;
    }
    

    编译无法通过, 但是还是可以通过A(1)的方式创建

    总结

    • 1 explicit关键字仅能用于类内部的构造函数, 可以不加该关键字, 但是需要注意可能隐藏的问题
    • 2 构造函数可以拥有多个形参, 但是必须可以只使用一个实参进行调用

    扩展

      在了解到拷贝构造函数和赋值运算符重载后, 我们应该会想到如果给一个函数传入一个类的实例的话, 比如fun(A); 那么实际进行的是拷贝赋值还是调用的是赋值运算符呢? 我们知道C语言进行的就是简单的赋值.

    答案: 拷贝构造函数; 事实上赋值运算符不会创建对象, 如果使用的是赋值运算符的话必然需要进行两次构造实例, 这是很不合理的. 同时我们可以知道默认就会创建一个拷贝构造函数

    相关文章

      网友评论

          本文标题:C++隐式类型转换的问题及explicit关键字

          本文链接:https://www.haomeiwen.com/subject/gvqlvctx.html