有如下一个简单的复数类:

class ClxComplex
{
public:ClxComplex(double dReal = 0.0, double dImage = 0.0) { m_dReal = dReal; dImage = dImage; }double GetReal() const { return m_dReal; }double GetImage() const { return m_dImage; }private:double m_dReal;double m_dImage;
};

我们知道,下面的3行代码是等价的:

ClxComplex lxTest = 2.0;
ClxComplex lxTest = ClxComplex(2.0);
ClxComplex lxTest = ClxComplex(2.0, 0.0);

其实,对于前两行来说,编译器都是把它们转换成第3行的代码来实现的。因为我们写了构造函数,编译器就按照我们的构造函数来进行隐式转换,直接把一个double数值隐式转换成了一个ClxComplex的对象。可是,有些时候,我们不希望进行隐式转换,或者隐式转换会造成错误。比如下面的一个简化的字符串类:

class ClxString
{
public:ClxString(int iLength);ClxString(const char *pString);~ClxString();private:char *m_pString;
};ClxString::ClxString(int iLength)
{if (iLength > 0)m_pString = new char[iLength];
}ClxString::ClxString(const char *pString)
{m_pString = new char[strlen(pString)];strcpy(m_pString, pString);
}ClxString::~ClxString()
{if (m_pString != NULL)delete m_pString;
}

我们可以用字符串的长度来初始化一个ClxString的对象,但是我们却不希望看到下面的代码:

ClxString lxTest = 13;  // 等同于ClxString lxTest = ClxString(13);

这会给阅读代码造成不必要的歧义。
还有,我们知道下面的代码是用字符串A来初始化一个ClxString的对象:

ClxString lxTest = "A";  // 等同于ClxString lxTest = ClxString("A");

可是,如果有人写成:

ClxString lxTest = 'A';  // 等同于ClxString lxTest = ClxString(65);

那上面的代码就会初始化一个长度为65(字母A的ASCII码值,在C和C++中,字符是以ASCII值存储的)的字符串。
当然,上面的情况都不是我们希望看到的。在这个时候我们就要用到显示构造函数了。
将构造函数声明成explicit就可以防止隐式转换。
下面是使用显示构造函数的ClxString:

class ClxString
{
public:explicit ClxString(int iLength);ClxString(const char *pString);~ClxString();private:char *m_pString;
};

在这种情况下,要想用字符串的长度来初始化一个ClxString对象,那就必须显示的调用构造函数:

ClxString lxTest = ClxString(13);

而下面这些代码将不能通过编译:

ClxString lxTest = 13; 
ClxString lxTest = 'A';

C++之显示构造函数相关推荐

  1. Java性能优化(3):通过私有构造函数强化不可实例化的能力

    有时候你可能会编写出只包含静态方法和静态域的类,这样的类有一些很不好的名声,因为有些人在面向对象的语言中滥用这样的类来编写过程化的程序.尽管如此,它们也确实有它们特有的用处,我们可以利用这种类,把操作 ...

  2. java显式构造函数_C++中的显式构造函数

    有如下一个简单的复数类: classClxComplex {public: ClxComplex(doubledReal=0.0,doubledImage=0.0){m_dReal=dReal;dIm ...

  3. Eclipse:构造函数不提示才发现

    用Eclipse快一年了,今天才发现,原来按下 Alt+? 就可以显示构造函数中的参数. 想一想这一年都不知道是怎么过的,遇到构造函数时,郁闷啊... 2007-11-01 转载于:https://w ...

  4. Caffe源码中Solver文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/solver.hpp文件的 ...

  5. Caffe源码中Net文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/net.hpp文件的内容: ...

  6. Caffe源码中Pooling Layer文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/vision_layers ...

  7. Caffe源码中blob文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/blob.hpp文件的内容 ...

  8. Caffe源码中syncedmem文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下syncedmem文件. 1.      include文件: (1).& ...

  9. java 参数 exception_java – 在异常的参数中使用泛型

    我正在尝试在异常中存储一些通用对象的集合,并且有麻烦弄清楚泛型.具体来说,我正在使用Hibernate Validator,并希望将收集到的违规列表保存在异常中,以便在另一层应用程序中进行处理.以下是 ...

最新文章

  1. python单链表实现荷兰国旗问题_这道荷兰旗问题,我面试时遇到三次!
  2. 助力健康中国,国内首个中文医疗信息处理挑战榜正式发布
  3. U-boot中TFTP 解释
  4. 2.3单链表的基本使用及其cpp示例
  5. 百度相关搜索软件_不太热门的办公神器软件篇搜索相关
  6. java连接ftp一直阻塞
  7. 为什么不能线程调用类的成员函数_C++多线程编程之创建线程的几种方法
  8. go数据结构与算法| 稀疏数组
  9. Java编写学生类student程序_编写一个JAVA程序片断定义一个表示学生的类student.docx...
  10. 不借助第三个变量进行两个变量的换位输出
  11. Java中将inputstream输入流转换成byte[]字节数组
  12. 日常Java练习题(每天进步一点点系列)
  13. Wordle_1.0
  14. 屏幕尺寸、分辨率、DPI、PPI
  15. 【读书笔记】《中央帝国的财政密码》
  16. 一度智信:电商推广计划
  17. 量子计算机和神威计算机哪个快,神威 计算机 IBM的量子计算机真的可以秒杀中国超算吗?(2)...
  18. 云计算导论(第二版)李伯虎著全部课后题的答案
  19. ev6 ev8 ev4a加密视频破解翻录提取教程
  20. nnunet 扩充流程

热门文章

  1. 贪吃蛇原型实现基本思路
  2. 设计模式学习笔记(十)——Decorator装饰模式
  3. 电动力学每日一题 2021/10/10
  4. NPM 安装 TypeScript 和 npm 的 Invalid package.json 错误以及运行第一个typescript程序
  5. 命令行设置Java环境变量
  6. VS条件断点学习总结
  7. arcgis engine 计算距离面积体积
  8. 图解RadASM使用初步
  9. Mysql存储引擎详解
  10. IDEA2017注册码