构造函数隐式转换_构造函数实例化对象

构造函数隐式转换_构造函数实例化对象转载博客:http://blog.csdn.net/thefutureisour/article/details/7705771构造函数隐式转换构造函数会引起一个不引人注意的问题:用单个实参来调用的构造函数定义了从从形参类型到类类型的一个隐式转换。举个例子说:classSales_item{public:std::istream&input(std…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

转载博客:

http://blog.csdn.net/thefutureisour/article/details/7705771

构造函数隐式转换

构造函数会引起一个不引人注意的问题:
用单个实参来调用的构造函数定义了从从形参类型到类类型的一个隐式转换。
举个例子说:

class Sales_item  
{  
public:  
    std::istream& input(std::istream& in);  
    std::ostream& output(std::ostream& out);  
    inline double avg_price() const;  
    bool same_isbn(const Sales_item &rbs) const  
    {  
        return isbn == rbs.isbn;  
    }  
    Sales_item add(Sales_item& other);  
    Sales_item(const std::string &book = "7115145547"):isbn(book),units_sold(0),revenue(0.0){}  
private:  
    std::string isbn;  
    unsigned units_sold;  
    double revenue;  
};  

这个类的same_isbn函数的输入参数是这个类的类型,但是我们却可以这样调用这个函数:

Sales_item trans1;  
string null_book = "9-999-99999-9";  
trans1.same_isbn(null_book);  

这是因为Sales_item的构造函数可以是带单个实参的(也可以不带实参,因为我定义了默认实参7115145547),这时在调用trans1.same_isbn(null_book);时,就会发生类型转化:从string转换为Sales_item。建立一个临时的类的对象(一旦函数调用结束,就不能再放这个对象了)。

为了避免这个情况的发生,可以将类的构造函数声明为explicit:

explicit Sales_item(const std::string &book = "7115145547"):isbn(book),units_sold(0),revenue(0.0){} 

这样,前面的默认类型转化就不起作用了。所以对于单形参构造函数,除非有非常明显的理由让他发生隐式类型转换,否者我们应该把它设计为explicit,防止隐式转化的发生。

当然我们总可以为转化而显示的使用构造函数:

trans1.same_isbn(Sales_item(null_book));
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183179.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java线程(九):Condition-线程通信更高效的方式

    Java线程(九):Condition-线程通信更高效的方式接近一周没更新《Java线程》专栏了,主要是这周工作上比较忙,生活上也比较忙,呵呵,进入正题,上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且ReadWriteLock在处理同步时更强大,那么同样,线程间仅仅互斥是不够的,还需要通信,本篇的内容是基于上篇之上,使用Lock如何处理线程通信。那么引入本篇的主角,Conditi…

    2022年6月22日
    26
  • hashmap遍历取值_java map遍历

    hashmap遍历取值_java map遍历HashMap遍历取值

    2025年10月16日
    3
  • pythonpip安装第三方库失败_python安装第三方库失败问题

    pythonpip安装第三方库失败_python安装第三方库失败问题关于Python第三方库安装失败问题的解决方案相信很多刚开始入门Python的菜鸟们在安装python第三方库的时候,多多少少都会遇到一些安装失败的问题。下面,我将结合自身经验,分享一下在windows操作系统上此类问题的解决办法。一、清楚自己所安装的python版本(2.7或3.6,andmore);二、检查是否安装了pip;如果确认上面那两点都没有问题的话,就请往下看:1、使用Pyth

    2022年8月31日
    3
  • ubuntu 安装Qt Creator

    ubuntu 安装Qt Creator转载地址:http://my.phirobot.com/blog/2013-12-ros_ide_qtcreator.htmlQt下载地址: http://download.qt.io/archive/ROS开发环境之QtCreatorCreatedat: 2013-12-29T00:00:00  YuanboShe  ROS  turtlebot, ros, qt,可以用于ROS开发的…

    2022年9月25日
    2
  • 深度学习 arm linux移植过程整理[通俗易懂]

    深度学习 arm linux移植过程整理[通俗易懂]一、环境搭建下载虚拟机VMwareWorkstation自行下载激活成功教程下载ubtun因运行环境使用ubtun18所虚拟机下载的ubtun18下载比较慢的话可以更换国内镜像https://cn.ubuntu.com/download/server/step1vm中安装ubtun虚拟机https://zhuanlan.zhihu.com/p/141033713下载支持包编译服务器需要安装包makecmake交叉编译链arm-linux-gunebhf例如:ap

    2022年9月24日
    1
  • SPI接口扫盲 SPI定义/SPI时序(CPHA CPOL)

    SPI接口扫盲 SPI定义/SPI时序(CPHA CPOL)SPI接口扫盲为何要写这篇文档?百度上找出来的SPI接口中文描述都说的太过简略,没有一篇文档能够详尽的将SPI介绍清楚的。wikipedia英文版[注释1]中,SPI接口介绍的很好,但是毕竟是英文版,读起来终究不如母语舒服,所以我结合自己的工作经验,对其进行了汉化、整理。个人SPI接口相关经验:1.参与过国产某芯片SPI接口样品验证、SPI接口服务DEMO开发(C语言)。2.使

    2022年6月18日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号