当前位置: 首页 > news >正文

c++ is on the way 7:显式构造函数

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

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


#include <iostream>
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: "<<cx.real<<"Imag Part: "<<cx.img<<endl;
}
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.使用建议

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

相关文章:

  • 安卓学习方法
  • 一个C#的XML数据库访问类
  • 图像的像素点操作【OpenCV学习笔记3】
  • 简单弹出视图
  • 文件的保存【OpenCV学习笔记4】
  • 清除vs2005、vs2008起始页最近打开项目
  • 51单片机-红外遥控解码
  • 汇编实验课程设计1
  • [转]实验室小科普之:方便又健康——洗水果的学问
  • C++ is on the way 8: 类初始化列表的分析总结
  • 异步DNS解析的实现
  • 图像绘制功能【OpenCV学习笔记5】
  • nopCommerce 3.3正式发布及新增功能改进
  • 对视频流进行边缘检测【OpenCV学习笔记6】
  • 发布一快速开发报表的类库,让报表的开发具有前所未有的方便和快速
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Asm.js的简单介绍
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Map集合、散列表、红黑树介绍
  • React组件设计模式(一)
  • SpringCloud集成分布式事务LCN (一)
  • VUE es6技巧写法(持续更新中~~~)
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 从0实现一个tiny react(三)生命周期
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 记录:CentOS7.2配置LNMP环境记录
  • 看域名解析域名安全对SEO的影响
  • 前端技术周刊 2019-02-11 Serverless
  • ​​​​​​​​​​​​​​Γ函数
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #etcd#安装时出错
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (规划)24届春招和25届暑假实习路线准备规划
  • .libPaths()设置包加载目录
  • .net反编译工具
  • .NET企业级应用架构设计系列之开场白
  • .sh
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @staticmethod和@classmethod的作用与区别
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [ 转载 ] SharePoint 资料
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [cogs2652]秘术「天文密葬法」
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [Deep Learning] 神经网络基础
  • [Django ]Django 的数据库操作
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • [idea]关于idea开发乱码的配置
  • [iOS开发]事件处理与响应者链
  • [JavaEE] 线程与进程的区别详解
  • [leetcode] 66. 加一
  • [linux c]linux do_div() 函数用法
  • [Linux] 常用命令--版本信息/关机重启/目录/文件操作