zoukankan      html  css  js  c++  java
  • C++: explicit的适用场合以及为什么要使用explicit

    explicit是个C++关键子,但是关注过它的人远远没有其他关键字的多,但是往往忽略了它,就会在一些不经意的地方造成错误,而花费更多的时间去寻找.

    看下下面这个例子:

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        A(int i = 5)
        {
            m_a = i;
         }
    private:
        int m_a;
    };
    
    int main()
    {
        A s;
        //我们会发现,我们没有重载'='运算符,但是去可以把内置的int类型赋值给了对象A.
        s = 10;
        //实际上,10被隐式转换成了下面的形式,所以才能这样.
        //s = A temp(10);
    
        system("pause");
        return 0;
    }
    

    我们发现成员变量的值被修改了.
    在这里插入图片描述
    由此可知:当类构造函数的参数只有一个的时候,或者所有参数都有默认值的情况下,类A的对象时可以直接被对应的内置类型隐式转换后去赋值的,这样会造成错误,所以接下来会体现出explicit这个关键词的作用.

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        //这里用explicit关键词来修饰类构造函数.
        explicit A(int i = 5, int j = 10)
        {
            m_a = i;
            m_b = j;
        }
    private:
        int m_a;
        int m_b;
    };
    
    int main()
    {
        A s;
        //这样直接赋值,会被提示错误,因为explicit抑制隐式转换的进行
        s = 10;//这样会报错!!!
        //当然显示转换还是可以的.
        s = A(20);
    
        system("pause");
        return 0;
    }
    

    通过两个例子我们知道:explicit可以抑制内置类型隐式转换,所以在类的构造函数中,最好尽可能多用explicit关键字,防止不必要的隐式转换.

  • 相关阅读:
    设置Kali Linux虚拟机连接网络
    修改Kali Linux终端主题
    Kali Linux修改桌面默认图标
    Metasploit技巧命令支持tips
    修改Kali Linux终端历史记录大小
    ListView 实现进度条显示
    Delphi 10.3.2 社区版的安装
    VMWare 下安装 Windows XP
    重新认识 Delphi
    VMWare 下安装 MSDN版 MS-DOS 6.22
  • 原文地址:https://www.cnblogs.com/laohaozi/p/12537699.html
Copyright © 2011-2022 走看看