博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C++学习】显式构造函数
阅读量:6039 次
发布时间:2019-06-20

本文共 1175 字,大约阅读时间需要 3 分钟。

作者:

出处:

1.什么是显式构造函数?

首先要理解什么是隐式构造函数,并且弄清它的优缺点。

 
#include 
using std::cout;
using std::endl;
class complexNumbers {
double real, img;
public:
complexNumbers() : real(0), img(0) { }
complexNumbers(const complexNumbers& c) { real = c.real; img = c.img; }
complexNumbers( double r, double i = 0.0) { real = r; img = i; }
friend void display(complexNumbers cx);
};
void display(complexNumbers cx){
cout<<"Real Part: "<
<<"Imag Part: "<
<
}
int main() {
complexNumbers one(1);
complexNumbers five = 5;
display(one);
display(five);
return 0;
}

在这段代码中,我们定义一个复数的模型,并且定义了三个构造函数,一个默认构造函数(第一个),一个复制构造函数(第二个),第三个就是帮助我们实现隐式构造的构造函数。我们在主程序中使用了这个函数定义了两个对象:

输出为:

Real Part: 1 Imag Part: 0

Real Part: 5 Imag Part: 0

此时并没有什么问题,我们在主程序中加入一句话:display(300); 然后看结果,多打印了一行:

Real Part: 300 Imag Part: 0

这并非我们希望出现的结果,那这是如何发生的呢?

这里display函数发现传入的是一个数字300时,与它期待的类型(complexNumbers)不符合,它就隐式调用了构造函数进行对象的构造,产生一个临时complexNumbers的实例对象。这种情况发生在存在可以接受一个参数的构造函数中(除复制构造函数)。

解决这个问题的方式就是强迫编译器必须使用显式构造的方式创建对象,这要在构造函数前使用explicit 关键字。回到这个例子,加上explicit后程序无法编译,这样就解决了该问题。如果还想方便使用的话只能如此显式创建对象:

display(complexNumbers(200));

2.使用建议

在中,有明文要求在可以接受一个参数的构造函数(除复制构造函数)中必须使用explicit关键字防止这样的情况。

作者:

出处:

转载地址:http://yyrhx.baihongyu.com/

你可能感兴趣的文章
批量添加-fno-objc-arc
查看>>
二叉树的层序遍历
查看>>
os模块
查看>>
安装 matplotlib
查看>>
css伪类(:before和:after)
查看>>
react native TypeError network request failed
查看>>
PLSQL锁表之后改如何操作
查看>>
Sql注入、文件上传与手机品牌信息抓取解决方案
查看>>
SQLServer跨库查询--分布式查询[转载]
查看>>
django错误-NoReverseMatch at /admin/
查看>>
Laravel中的信息验证 和 语言包
查看>>
折半查找法(二分查找 java版)
查看>>
工作两周年—--个人知识体系梳理
查看>>
win2003开启telnet
查看>>
php配置文件php.ini中文详解
查看>>
关于Tomcat配置相关总结
查看>>
安装PDO_MYSQL遇到的问题:error: Cannot find MySQL header files under
查看>>
CocoaPods最新安装及跳过pod setup快速安装教程
查看>>
必须用C模拟OS?
查看>>
JavaScript引入
查看>>