zoukankan      html  css  js  c++  java
  • C++中的explicitkeyword

    在C++程序中非常少有人去使用explicitkeyword,不可否认,在平时的实践中确实非常少能用的上。再说C++的功能强大,往往一个问题能够利用好几种C++特性去解决。但略微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是非常高的。了解explicitkeyword的功能及其使用对于我们阅读使用库是非常有帮助的,并且在编写自己的代码时也能够尝试使用。既然C++语言提供这样的特性,我想在有些时候这样的特性将会非常实用。
    按默认规定,仅仅用传一个參数的构造函数也定义了一个隐式转换。举个样例:
    (以下这个CExample没有什么实际的意义,主要是用来说明问题)
    //Example.h
    #pragma once
    class CExample
    {
    public:
    CExample(void);
    public:
    ~CExample(void);
    ­
    public:
    int m_iFirst;
    int m_iSecond;
    public:
    CExample(int iFirst, int iSecond = 4);
    };
    //Example.cpp
    #include "StdAfx.h"
    #include "Example.h"
    CExample::CExample(void)
    : m_iFirst(0)
    {
    }
    CExample::~CExample(void)
    {
    }
    CExample::CExample(int iFirst, int iSecond):m_iFirst(iFirst), m_iSecond(iSecond)
    {
    }
    //TestExplicitKey.cpp
    ...//其他头文件
    #include "Example.h"
    int _tmain(int argc, _TCHAR* argv[])
    {
    CExample objOne; //调用没有參数的构造函数
    CExample objTwo(12, 12); //调用有两个參数的构造函数
    CExample objThree(12); //同上,能够传一个參数是由于该构造函数的第二个參数有默认值
    CExample objFour = 12; //运行了隐式转换,等价于CExample temp(12);objFour(temp);注意这个地方调用了
    //编译器为我们提供的默认复制构造函数
    return 0;
    }
    假设在构造函数声明中增加keywordexplicit,例如以下
    explicit CExample(int iFirst, int iSecond = 4);
    那么CExample objFour = 12; 这条语句将不能通过编译。在vs05下的编译错误提演示样例如以下
    error C2440: 'initializing' : cannot convert from 'int' to 'CExample'
            Constructor for class 'CExample' is declared 'explicit'
    对于某些类型,这一情况很理想。但在大部分情况中,隐式转换却easy导致错误(不是语法错误,编译器不会报错)。隐式转换总是在我们没有察觉的情况下悄悄发生,除非有心所为,隐式转换经常是我们所不希望发生的。通过将构造函数声明为explicit(显式)的方式能够抑制隐式转换。也就是说,explicit构造函数必须显式调用。
    引用一下Bjarne Stroustrup的样例:
    class String{
          explicit String(int n);
          String(const char *p);
    };
    String s1 = 'a'; //错误:不能做隐式char->String转换
    String s2(10);   //能够:调用explicit String(int n);
    String s3 = String(10);//能够:调用explicit String(int n);再调用默认的复制构造函数
    String s4 = "Brian"; //能够:隐式转换调用String(const char *p);再调用默认的复制构造函数
    String s5("Fawlty"); //能够:正常调用String(const char *p);
    void f(String);
    ­
    String g()
    {
        f(10); //错误:不能做隐式int->String转换
        f("Arthur"); //能够:隐式转换,等价于f(String("Arthur"));
        return 10; //同上
    }
    在实际代码中的东西可不像这样的有益造出的样例。
    发生隐式转换,除非有心利用,隐式转换经常带来程序逻辑的错误,并且这样的错误一旦发生是非常难察觉的。
    原则上应该在全部的构造函数前加explicitkeyword,当你有心利用隐式转换的时候再去解除explicit,这样能够大大降低错误的发生。
    ­
  • 相关阅读:
    安装VMtools vim编辑器的使用 压缩包命令 Linux下的用户管理 (第三天)
    VM虚拟机安装 常用Linux命令 网卡配置 (第二天)
    数据库的交互模式 常用的dos命令 (第一天)
    Validate US Telephone Numbers FreeCodeCamp
    Arguments Optional FreeCodeCamp
    Everything Be True FreeCodeCamp
    Binary Agents FreeCodeCamp
    Steamroller FreeCodeCamp
    Drop it FreeCodeCamp
    Smallest Common Multiple FreeCodeCamp
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4080439.html
Copyright © 2011-2022 走看看