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


相关推荐

  • 妈妈再也不用担心我的博客访问量了(一个可以刷博客访问量的小程序java)「建议收藏」

    妈妈再也不用担心我的博客访问量了(一个可以刷博客访问量的小程序java)「建议收藏」前言:相信很多写博客的朋友,会苦恼于博客访问量上不去的问题。博主最近工作比较新手动谢了个小程序,一个可以刷访问量的程序。当然主要是针对csdn博客。有了他就再也不必担心博客访问量上不去的问题了。注:博客最主要还是要自己做好seo优化,以及提高博客内容质量。本篇文章,仅供学习交流。大家如果有问题,可以留言。一,废话少说,看图:软件点击jar包直接运行:如下:稍后查看博客访问量会有变化哟,博主

    2022年6月17日
    22
  • python检查文件更新失败_恢复自动更新/更新失败解决方法个人汇总[通俗易懂]

    python检查文件更新失败_恢复自动更新/更新失败解决方法个人汇总[通俗易懂]步骤一:服务开启首先,打开任务管理器(快捷键Ctrl+shift+esc)(或者右键开始图标任务管理器(此方法只适应Win8Win10))(或者Ctrl+Alt+Del,点击任务管理器)打开服务选项卡+打开服务找到windowsupdate,右键,属性启动类型改为手动如果要关闭更新请改为禁用步骤二:组策略开启windows微标键+R键呼出【运行】2输入【gpedit.msc】组策略编辑器计算机配…

    2022年5月16日
    34
  • c语言中位运算符的用法_c语言中位运算符的优先级

    c语言中位运算符的用法_c语言中位运算符的优先级位 运 算一直对位运算头疼,在此总结一下   程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。运位算包括位逻辑运算和移位运算,位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;移位运算可以对内存中某个二进制数左移或右移几位等。计算机内部是以补码形式存放数值的。C语言提供了六种位运算位运算符含义…

    2022年10月5日
    2
  • Java并发编程:线程池的使用

    Java并发编程:线程池的使用

    2022年2月21日
    39
  • Python学习总结(1)—turtle海龟作图

    Python学习总结(1)—turtle海龟作图海龟作图1.海龟移动和绘制2.获取海龟的状态3.设置与度量单位4.画笔绘图状态5.画笔颜色控制6.填充7.更多绘图控制8.海龟可见性9.海龟外观10.使用事件11.特殊海龟方法1.海龟移动和绘制forward(distance)前进backward(distance)后退right(degree)右转默认为角度left(degree)左转默认为角度goto(newX,n…

    2022年6月28日
    33
  • java jar 没有主清单_java运行jar命令提示没有主清单属性

    java jar 没有主清单_java运行jar命令提示没有主清单属性在 JAVA 中将 class 文件编译成 jar 文件包 运行提示没有主清单属性 这是怎么回事 今天来教大家如何解决这个问题 1 在 java 中编译 JAR 文件的时候我们都会用到 jar 这个命令 当用着 jar 文件时候我们不可少的是 cvf 这几个参数来生成 jar 文件 但是用个文件来了 在用不使用工具的前提下我们生成的 jar 文件包后运行会出现 某某类的没有主清单属性 如下图 2 这样的问题是因为 jar 包中的 META

    2025年11月6日
    1

发表回复

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

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