• *** C++中explicit与隐式转换


        普通构造函数可以被隐式调用,而explicit构造函数(显式构造函数)只能被显式调用

    关于隐式转换,参考:【转】这篇文章 

    首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)

    《C++ Primer》中提到:

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

    这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的。

    那么,什么是“隐式转换”呢? 上面这句话也说了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换。

    1.   可以使用一个实参进行调用,不是指构造函数只能有一个形参。

    2.   隐式类类型转换容易引起错误,除非你有明确理由使用隐式类类型转换,否则,将可以用一个实参进行调用的构造函数都声明为explicit。

    3.       explicit只能用于类内部构造函数的声明。它虽然能避免隐式类型转换带来的问题,但需要用户能够显式创建临时对象(对用户提出了要求)

    #include <iostream>
    #include <string.h>
    using namespace std;
    class Test1
    {
    public:
        Test1(int n) // 普通构造函数
        {num = n;}
    private:
        int num;
    };
    class Test2
    {
    public:
        explicit Test2(int n) // (显式)构造函数
        {num = n;} 
    private:
        int num;
    };
    int main()
    {
        Test1 t1 = 1;
        Test2 t2 = 2; //编译错误
        Test2 t3(3);
        return 0;
    }
  • 相关阅读:
    【loj6179】Pyh的求和
    【bzoj4036】按位或
    【CF472G】Design Tutorial: Increase the Constraints
    【bzoj4811】由乃的OJ
    双马尾机器人(???)
    【codechef】Children Trips
    【bzoj3796】Mushroom追妹纸
    【bzoj4571】美味
    前夕
    【bzoj3589】动态树
  • 原文地址:https://www.cnblogs.com/superrunner/p/10165142.html
Copyright © 2020-2023  润新知