C++中的explicitkeyword

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,这样能够大大降低错误的发生。
­
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119012.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • symbian软件下载_手机系统更新软件

    symbian软件下载_手机系统更新软件编辑器加载中…常见软件类型  .sis和.sisx  分别的是第一、二版和第三版、第五版标准的SymbianOS操作系统唯一的可执行安装的安装文件,直接传入手机安装即可。  .app  一般来说*.app文件是某个软件的激活成功教程补丁文件,就是可以将未注册的软件变成已注册软件的文件。一般使用app激活成功教程的方法:利用文件管理程序(如文件动力)将某个软件一同带的*.app文件通过…

    2022年9月24日
    0
  • Java中StringBuilder类「建议收藏」

    Java中StringBuilder类「建议收藏」提要大家要知道字符串(String)在进行拼接操作时,每一次拼接,都会构建一个新的String对象这样耗时又浪费内存解决方法就是StringBuilder类,就可以解决这个问题StringBuilder类中方法和String类基本一样我举例几个使用最多的方法创建//创建StringBuilderStringBuildersb=newStringBuilder(“老八”);System.out.println(sb);//输出如果括号里不填默认是空字符串

    2022年7月17日
    17
  • matlab读取txt文件指定行_matlab中if判断中返回

    matlab读取txt文件指定行_matlab中if判断中返回MATLAB提供了一系列低层输入输出函数,专门用于文件操作。本文提供了几种Matlab读写文件的方法和预写的脚本。

    2022年9月6日
    2
  • asp.net core 关于自增长ID数据保护(IDOR漏洞)[通俗易懂]

    asp.net core 关于自增长ID数据保护(IDOR漏洞)[通俗易懂]开始前先大概的描述下IDOR漏洞是啥。嗯!举个例子,有一个角色下面有N个用户,拥有这个角色的用户都有自身创建的普通用户操作权限(比如删除)。我们一般情况都是通过表主键来操作这条记录的,那么这么一个功能就涉及到两个接口(查询列表,删除指定用户)。嗯!查询列表的接口自然是要带着用户对应的主键的(通过删除接口传入ID),聪明的人应该想到了;此时ID是明文的并且主键我们一般都是自增长的,此时就会出现我们可以通过猜测这个参数进行恶意删除。嗯!此时有些人可能会想(也是几种解决方式):我可以通过对参数进行加密签名来

    2022年5月1日
    57
  • 缓冲流、转换流、序列化流、Files

    缓冲流、转换流、序列化流、Files

    2021年5月19日
    123
  • springboot实战第四章-SpringMVC的文件上传配置

    springboot实战第四章-SpringMVC的文件上传配置

    2021年5月15日
    123

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号