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

构造函数隐式转换_构造函数实例化对象转载博客: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));
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 论坛发帖技巧_百度贴吧回复显示帖子审核中

    论坛发帖技巧_百度贴吧回复显示帖子审核中8)今天看到个帖子,想贴个回复,点个引用出来了小测验.开始的时候还没细看以为是调查,结果:cry:看表情应该知道,原来是有答案的,大部分答错,也没了逛论坛的心情.我很想知道,以最俗的免费公厕,要是说大家没用过,那我肯定不相信,一般的公厕都在入门的地方挂个牌牌,使用细则什么的,试问:有人上公厕之前认真细读过么?而…

  • 本地phpstudy开发中apache可以用,nginx不可用,

    本地phpstudy开发中apache可以用,nginx不可用,

    2021年10月12日
  • .bat批处理基础

    .bat批处理基础批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat。目前比较常见的批

  • vue html编辑器_基于vue的低代码编辑器

    vue html编辑器_基于vue的低代码编辑器最近需要用到富文本编辑器插件,项目是用VUE框架搭建的所以这里就专门介绍几款有关vue的富文本插件:项目中趟过了很多坑,特记下供大家借鉴,希望大家不要重滔我的复撤本文章只介绍插件具体使用方式可自行百度由于编辑器编辑的内容需要在小程序能完美显示,并且能和小程序富文本编辑器完全打通1.百度的ueditor(网上都这么说)(没有缘分,果断放弃)优势:开源,插件多,基本满足各种需求,由百度we…

    2022年10月14日
  • 【P2P】【转载】P2P流媒体开源项目介绍[通俗易懂]

    大神的整理P2P流媒体开源项目介绍前言:最近在做一个网站,发现p2p流媒体技术对于解决高流量高带宽问题真的很不错。据说现在一些视频和直播公司在研究p2p+cdn,证明了p2p永不过时。先记录先来,有时间慢慢研究PeerCast2002年成立,最早的开源P2P流媒体项目。PeerCast把节点按树结构组织起来,每个频道都是一个树,直播源是根节点,父节点只给子节点提供数据。节点离根节点越远,传输时延就越大,所以树的深度应该尽可能短,但节点有限的上行带宽限制了节点的宽度。Tribler..

  • idea如何打包_用两种方法表示13

    idea如何打包_用两种方法表示13方式一、build打包1、进入projectstructure2、要选择启动类以及MANIFEST.MF选择src目录下即可3、进行build打包打包后生成jar包应该位于项目下out目录中。(如果启动有问题无法解决,可尝试方式二)方式二:maven打包1、pom添加依赖<build><plugins><plugin><groupId>org.springfram

发表回复

您的电子邮箱地址不会被公开。

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