Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >构造函数隐式转换_构造函数实例化对象

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

作者头像
全栈程序员站长
发布于 2022-11-10 07:58:06
发布于 2022-11-10 07:58:06
44800
代码可运行
举报
运行总次数:0
代码可运行

转载博客:

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

构造函数隐式转换

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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函数的输入参数是这个类的类型,但是我们却可以这样调用这个函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
explicit Sales_item(const std::string &book = "7115145547"):isbn(book),units_sold(0),revenue(0.0){} 

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
trans1.same_isbn(Sales_item(null_book));

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
c++ | 训练01
// 11. 由多个文件组成的程序需要一种方法连接名字的使用和声明,c++通过头文件实现
heidsoft
2022/03/14
2920
C++(STL):02---tuple容器
一、tuple的历史概述 Tuple是TR1引入的东西,它扩展了pair的概念,拥有任意数量的元素。在C++11标准之前,tuple最多带有10个类型不同的元素 C++11,tuple被重新定义,采用variadic template概念,被设计为可用于任意大小的异质集合 二、tuple概述 tuple与pair类似,也是一个模板。pair接受两个成员,tuple接受任意数目的成员 当我们希望将一些数据组合成单一对象时,tuple非常有用 tuple的实现 TR1标准时(C++11之前),tuple最多带有
用户3479834
2021/02/03
1.3K0
C++(STL):02---tuple容器
C++-->类
一、C++类的定义 C++中使用关键字 class 来定义类, 其基本形式如下:
Max超
2022/03/08
7650
C++:32---IO库
一、IO库 I0库类型和头文件 头文件 类型 iostream istream,wistream从流读取数据ostream,wostream向流写入数据iostream,wiostream读写流
用户3479834
2021/02/03
6140
C++:32---IO库
C++面向对象编程一些拾遗
虽然说是拾遗,但是这里有一大部分是我以前没有看过的,简书的markdown不支持生成目录,可能需要手动来一个了。
和蔼的zhxing
2018/09/04
7100
C++面向对象编程一些拾遗
两万字总结《C++ Primer》要点
类型说明符,随后紧跟着一个或者多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。
博文视点Broadview
2021/04/09
1.8K0
两万字总结《C++ Primer》要点
《C++Primer》第七章 类
类的基本思想是数据抽象data abstraction和封装encapsulation。数据抽象是一种依赖于接口interface和实现implementation分离的编程技术。类的接口包括用户所能执行的操作;类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。
TOMOCAT
2020/12/02
5760
第 14 章 重载运算与类型转换
第 14 章 重载运算与类型转换 标签(空格分隔): C++Primer 学习记录 运算符重载 类型转换 ---- 第 14 章 重载运算与类型转换 14.1 基本概念 14.2 输入和输出运算符 14.3 算术和关系运算符 14.4 赋值运算符 14.5 下标运算符 14.6 递增和递减运算符 14.7 成员访问运算符 14.8 函数调用运算符 14.9 重载、类型转换与运算符 ---- 14.1 基本概念 重载的运算符是具有特殊名字的函数,他们的名字由关键字 operator和其后要定义的运算符号共
用户1653704
2018/06/07
9200
《C++Primer》第十四章 重载运算与类型转换
我们定义重载的运算符时,必须首先决定它是声明为类的成员函数还是声明为一个普通的非成员函数:
TOMOCAT
2020/11/24
9450
【C++】‘类与对象‘-三部曲——[基础知识](3)(1/3)
例:比如下面Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time 类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
YY的秘密代码小屋
2024/01/22
1440
【C++】‘类与对象‘-三部曲——[基础知识](3)(1/3)
c++IO库之文件输入输出详细整理,建议赶紧收藏!!!
重要的部分是对read和print的调用,虽然两个函数定义时指定的形参分别是istream&和ostream&,但我们可以向他们传递fstream对象
大忽悠爱学习
2021/11/15
7210
C++ 类和对象
class为定义类的关键字,stack,list,vector,queue等都是类的名字,而{}内的东西是类的类的主体。类体中内容被称为类的成员:类中的变量为类的属性或者成员变量;类内的函数时类的方法和成员函数。
2024/11/24
1120
《C++Primer》第十八章 用于大型程序的工具
在C++语言中,我们通过抛出throwing一条表达式来引发raised一个异常。当执行一个throw时,跟在throw后面的语句将不再被执行。相反,程序的控制权从throw转移到与之匹配的catch模块。
TOMOCAT
2020/12/03
1.4K0
《C++Primer》第十八章 用于大型程序的工具
C++初阶学习第五弹——类与对象(下)——类与对象的收官战
在前面,我们说对一个自定义类型的变量,当我们定义时可以通过构造函数默认初始化,操作如下:
GG Bond1
2024/06/14
950
C++初阶学习第五弹——类与对象(下)——类与对象的收官战
C++函数指针和std::function对象
这篇博文中通过实现对String字符串大小写转换为列来说明C++中函数指针和std::function对象的使用。
卡尔曼和玻尔兹曼谁曼
2019/01/22
2.6K0
自实现 MyString 类
自实现 myString 类主要目的是剖析系统内部的 string 类的一些实现方法以及加强对类封装、运算符重载等特性的掌握。其中包含了几项非常重要的功能实现。
我与梦想有个约会
2023/10/20
2250
图书管理系统(C++)
统一书号(不超过13字符) 书名(不超过30字符) 作者(不超过20字符) 出版社(不超过30字符) 出版日期(包括:年、月、日) 价格(精确到分) 注意:为了保证运行窗口能正确地显示,请右击运行窗口,修改“属性”:
GeekLiHua
2025/01/21
450
C++:类与对象(3)
如上图,在一般情况下,我们认为A类中的_a1和_a2只不过是声明,并没有开空间,而真正的空间开辟是在【定义】的时候,也就是我们根据这个类实例化出整个对象的时候。
小陈在拼命
2024/02/28
1280
C++:类与对象(3)
C++心决之类和对象详解(下篇)(封装进阶篇)
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,
一枕眠秋雨
2024/05/04
1050
C++第六弹 -- 类与对象下篇(初始化列表 Static成员 友元 内部类 匿名对象)
本篇文章介绍了类和对象初始化列表, 静态成员变量以及静态成员函数, 友元, 以及内部类和匿名对象, 希望能够帮助读者更好的理解类和对象
用户11317877
2024/10/16
1130
C++第六弹 -- 类与对象下篇(初始化列表 Static成员 友元 内部类 匿名对象)
相关推荐
c++ | 训练01
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验