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

构造函数隐式转换_构造函数实例化对象转载博客: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)
上一篇 2022年10月11日 下午1:16
下一篇 2022年10月11日 下午1:36


相关推荐

  • 基于IPMI的FRU

    基于IPMI的FRU1 fru 介绍 FieldReplace 现场可更换单元 FRU 的技术最早使用在服务器等大型设备上 以 IBM 的水平最高 后来 FRU 技术被 dell 移植在 PC 上 接着联想等厂商也开始了 FRU 的步伐 现在连太和攒电脑的都使用 FRU 技术了 IPMI 规范包括支持为系统中的不同模块存储和访问多组非易失性现场可更换单元 FRU 信息 一个企业级的系统通常将拥有每个主要的系统板的 FRU 信息 例如 处理器板 内存板 输入输出板等 FRU 数据包括序列号 零件号 型号 资产标签等信息 IPMIFRU 信息可以通过

    2026年3月20日
    2
  • Linux 路由表之route 命令详解

    Linux 路由表之route 命令详解参考资料 Linux 内核的路由表通过 route 命令查看 Linux 内核的路由表 root VM 139 74 centos routeKernelI 0 0 0UG000

    2026年3月17日
    2
  • Python: sklearn库中数据预处理函数fit_transform()和transform()的区别

    Python: sklearn库中数据预处理函数fit_transform()和transform()的区别敲 Python 机器学习及实践 上的 code 的时候 对于数据预处理中涉及到的 fit transform 函数和 transform 函数之间的区别很模糊 查阅了很多资料 这里整理一下 涉及到这两个函数的代码如下 从 sklearn preprocessin 导入 StandardScal preprocessin 标

    2026年3月17日
    1
  • sendfile:Linux中的”零拷贝”

    sendfile:Linux中的”零拷贝”如今几乎每个人都听说过Linux中所谓的”零拷贝”特性,然而我经常碰到没有充分理解这个问题的人们。因此,我决定写一些文章略微深入的讲述这个问题,希望能将这个有用的特性解释清楚。在本文中,将从用户空间应用程序的角度来阐述这个问题,因此有意忽略了复杂的内核实现。什么是”零拷贝”为了更好的理解问题的解决法,我们首先需要理解问题本身。首先我们以一个网络服务守护进程为例,考虑它在将存储在文件

    2022年6月1日
    32
  • 【OpenGrok代码搜索引擎】一、OpenGrok简介

    【OpenGrok代码搜索引擎】一、OpenGrok简介OpenGrok是一个快速的、非常有用的代码搜索和交叉引用引擎。它由Java语言编写而成。它可以帮助你快速的搜索,交叉引用和索引你的代码树。它可以很好的识别多种应用程序文件格式和代码版本控制工具。

    2022年4月30日
    51
  • dom4j和jaxp解析工具的

    dom4j和jaxp解析工具的

    2021年12月4日
    33

发表回复

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

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