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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 教师资格证面试容易过吗_面试官不录用你的暗示

    教师资格证面试容易过吗_面试官不录用你的暗示什么是连接查询?笛卡尔积如何避免?内连接和外连接的概念是什么?表连接的原理是什么?SimpleNested-LoopJoin、IndexNested-LoopJoin、BlockNested-LoopJoin分别是什么概念?Nested-LoopJoin和BlockNested-LoopJoin对比分析驱动表用什么比较合适?

    2022年8月30日
    2
  • PHP一句话木马后门

    PHP一句话木马后门在我们进行渗透测试的最后阶段,入侵到内网里,无论是想要浏览网站结构,还是抓取数据库,或者是挂个木马等等,到最后最常用的就是执行一句话木马,从客户端轻松连接服务器。一句话木马的原理很简单,造型也很简单,所以造成了它理解起来容易,抵御起来也容易。于是黑白的较量变成了黑帽不断的构造变形的后门,去隐蔽特征,而白帽则不断的更新过滤方法,建起更高的城墙。一、原理简述对于不同的语言有不同的构造方法。…

    2022年5月21日
    79
  • poj 3237 Tree(树链拆分)

    poj 3237 Tree(树链拆分)

    2022年1月3日
    42
  • javaint和integer的区别_java中integer

    javaint和integer的区别_java中integer原文地址:http://www.cnblogs.com/shenliang123/archive/2011/10/27/2226903.htmlint与integer的区别从大的方面来说就是基本数据类型与其包装类的区别:int是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象1.Java中的数据类型分为基本数据类型和复杂数据类型int是前者而int

    2025年6月2日
    3
  • Word2vec原理及其Python实现「建议收藏」

    Word2vec原理及其Python实现「建议收藏」目录一、为什么需要WordEmbedding二、Word2vec原理1、CBOW模型2、Skip-gram模型三、行业上已有的预训练词向量四、用Python训练自己的Word2vec词向量一、为什么需要WordEmbedding在NLP(自然语言处理)里面,最细粒度的是词语,词语组成句子,句子再组成段落、篇章、文档。所以要处理NLP的问题,首先就要拿词语开刀…

    2022年5月17日
    38
  • LARGE_INTEGER类型和LONGLONG类型以及QueryPerformanceFrequency函数

    LARGE_INTEGER类型和LONGLONG类型以及QueryPerformanceFrequency函数LARGE_INTEGERLARGE_INTEGER是union,表示64位有符号整数值。其定义如下:    typedefunion_LARGE_INTEGER{     struct{                 DWORDLowPart;                 LONGHighPart;               };

    2022年7月16日
    24

发表回复

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

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