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

构造函数隐式转换_构造函数实例化对象转载博客: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中的数据类型有哪些?

    java中的数据类型有哪些?基本数据类型:boolean、char、byte、short、int、long、float、double引用数据类型:类、接口、数组

    2022年7月7日
    22
  • linux安装软件的三种方式:yum install 、rpm安装以及源码包安装

    linux安装软件的三种方式:yum install 、rpm安装以及源码包安装目录【RPM工具】【yum工具】【安装源码包】正文在windows下安装一个软件很轻松,只要双击setup或者.exe的文件,安装提示连续“下一步”即可,然而linux系统下安装一个软件似乎并不那么轻松了,因为我们不是在图形界面下。所以你要学会如何在linux下安装一个软件。在前面的内容中多次提到的yum,这个yum是Redhat所特有的安装RPM程序…

    2022年5月26日
    44
  • 在触发思考

    在触发思考

    2022年1月11日
    48
  • ByteBuffer的allocate和allocateDirect

    ByteBuffer的allocate和allocateDirect在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式:Java代码publics

    2022年7月3日
    21
  • 六大算法之动态规划_动态规划求解最大子数组

    六大算法之动态规划_动态规划求解最大子数组一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。向右 -> 向下 -> 向下向下 -> 向下 -> 向右向下 -> 向右 -&gt

    2022年8月9日
    5
  • goland2022.01激活【最新永久激活】

    (goland2022.01激活)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~G…

    2022年3月31日
    1.0K

发表回复

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

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