• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++中的explicit关键字实例浅析

C++中的explicit关键字实例浅析

作者:FanTasyCC 字体:[增加 减小] 来源:互联网 时间:2017-05-28

FanTasyCC 通过本文主要向大家介绍了c++中explicit,c++ explicit,explicit关键字,explicit,explicittube等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用。既然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;
}
</div>

如果在构造函数声明中加入关键字explicit,如下

explicit CExample(int iFirst, int iSecond = 4);
</div>

那么CExample objFour = 12; 这条语句将不能通过编译。在vs05下的编译错误提示如下

error C2440: 'initializing' : cannot convert from 'int' to 'CExample'
    Constructor for class 'CExample' is declared 'explicit'
</div>

对于某些类型,这一情况非常理想。但在大部分情况中,隐式转换却容易导致错误(不是语法错误,编译器不会报错)。隐式转换总是在我们没有察觉的情况下悄悄发生,除非有心所为,隐式转换常常是我们所不希望发生的。通过将构造函数声明为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; //同上
}
</div>

在实际代码中的东西可不像这种故意造出的例子。

发生隐式转换,除非有心利用,隐式转换常常带来程序逻辑的错误,而且这种错误一旦发生是很难察觉的。

原则上应该在所有的构造函数前加explicit关键字,当你有心利用隐式转换的时候再去解除explicit,这样可以大大减少错误的发生。

以上所述是小编给大家介绍的C++中的explicit关键字实例浅析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++中的explicit关键字实例浅析
  • 浅谈C++ Explicit Constructors(显式构造函数)
  • C++ explicit构造函数实例解析
  • C++ explicit关键字的应用方法详细讲解
  • C++ Explicit关键字详细解析

相关文章

  • 2017-05-28Cocos2d-x UI开发之CCControlButton控件类实例
  • 2017-05-28C++中异常处理的基本思想及throw语句抛出异常的使用
  • 2017-05-28简要对比C语言中的dup()函数和dup2()函数
  • 2017-05-28C++自定义函数判断某年某月某日是这一年中第几天
  • 2017-05-28冒泡排序的三种实现方法
  • 2017-05-28c++二叉树的几种遍历算法
  • 2017-05-28Linux系统中C语言编程创建函数fork()执行解析
  • 2017-05-28C语言 共用体(Union)详解及示例代码
  • 2017-05-28k均值算法c++语言实现代码
  • 2017-05-28浅析iterator与指针的区别

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 深入理解c语言数组
    • Windows程序内部运行机制实例详解
    • 排列组合总结:将结果进行输出的实现方法
    • C++ 单链表的基本操作(详解)
    • C++实现大数乘法算法代码
    • c++ const引用与非const引用介绍
    • 有关C++继承与友元、继承与类型转换详解
    • C 语言基础教程(我的C之旅开始了)[八]
    • C++简单QQ程序服务器端的实现代码
    • C++多线程编程时的数据保护

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有