C++之显示构造函数
有如下一个简单的复数类:
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++之显示构造函数相关推荐
- Java性能优化(3):通过私有构造函数强化不可实例化的能力
有时候你可能会编写出只包含静态方法和静态域的类,这样的类有一些很不好的名声,因为有些人在面向对象的语言中滥用这样的类来编写过程化的程序.尽管如此,它们也确实有它们特有的用处,我们可以利用这种类,把操作 ...
- java显式构造函数_C++中的显式构造函数
有如下一个简单的复数类: classClxComplex {public: ClxComplex(doubledReal=0.0,doubledImage=0.0){m_dReal=dReal;dIm ...
- Eclipse:构造函数不提示才发现
用Eclipse快一年了,今天才发现,原来按下 Alt+? 就可以显示构造函数中的参数. 想一想这一年都不知道是怎么过的,遇到构造函数时,郁闷啊... 2007-11-01 转载于:https://w ...
- Caffe源码中Solver文件分析
Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/solver.hpp文件的 ...
- Caffe源码中Net文件分析
Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/net.hpp文件的内容: ...
- Caffe源码中Pooling Layer文件分析
Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/vision_layers ...
- Caffe源码中blob文件分析
Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/blob.hpp文件的内容 ...
- Caffe源码中syncedmem文件分析
Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下syncedmem文件. 1. include文件: (1).& ...
- java 参数 exception_java – 在异常的参数中使用泛型
我正在尝试在异常中存储一些通用对象的集合,并且有麻烦弄清楚泛型.具体来说,我正在使用Hibernate Validator,并希望将收集到的违规列表保存在异常中,以便在另一层应用程序中进行处理.以下是 ...
最新文章
- python单链表实现荷兰国旗问题_这道荷兰旗问题,我面试时遇到三次!
- 助力健康中国,国内首个中文医疗信息处理挑战榜正式发布
- U-boot中TFTP 解释
- 2.3单链表的基本使用及其cpp示例
- 百度相关搜索软件_不太热门的办公神器软件篇搜索相关
- java连接ftp一直阻塞
- 为什么不能线程调用类的成员函数_C++多线程编程之创建线程的几种方法
- go数据结构与算法| 稀疏数组
- Java编写学生类student程序_编写一个JAVA程序片断定义一个表示学生的类student.docx...
- 不借助第三个变量进行两个变量的换位输出
- Java中将inputstream输入流转换成byte[]字节数组
- 日常Java练习题(每天进步一点点系列)
- Wordle_1.0
- 屏幕尺寸、分辨率、DPI、PPI
- 【读书笔记】《中央帝国的财政密码》
- 一度智信:电商推广计划
- 量子计算机和神威计算机哪个快,神威 计算机 IBM的量子计算机真的可以秒杀中国超算吗?(2)...
- 云计算导论(第二版)李伯虎著全部课后题的答案
- ev6 ev8 ev4a加密视频破解翻录提取教程
- nnunet 扩充流程