C 隐式类型转换是什么?

C 隐式类类型转换

《C Primer》中提到:

“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”

这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的。

那么,什么是“隐式转换”呢? 上面这句话也说了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换。

下面通过代码来看一看:

#include "stdafx.h"

#include 

#include 

using namespace std ;

class BOOK  //定义了一个书类

{

    private:

        string _bookISBN ;  //书的ISBN号

        float _price ;    //书的价格

 

    public:

        //定义了一个成员函数,这个函数即是那个“期待一个实参为类类型的函数”

        //这个函数用于比较两本书的ISBN号是否相同

        bool isSameISBN(const BOOK & other ){

            return other._bookISBN==_bookISBN;

                }

 

        //类的构造函数,即那个“能够用一个参数进行调用的构造函数”(虽然它有两个形参,但其中一个有默认实参,只用一个参数也能进行调用)

        BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){}

};

 

int main()

{

    BOOK A("A-A-A");

    BOOK B("B-B-B");

 

    cout<<a.issameisbn(b)<
 

    cout<<a.issameisbn(string("a-a-a"))<BOOK类型,借助BOOK的构造函数进行转换,以满足isSameISBN函数的参数期待。

    cout<<a.issameisbn(book("a-a-a"))<
     

    system("pause");

}

代码中可以看到,isSameISBN函数是期待一个BOOK类类型形参的,但我们却传递了一个string类型的给它,这不是它想要的啊!还好,BOOK类中有个构造函数,它使用一个string类型实参进行调用,编译器调用了这个构造函数,隐式地将stirng类型转换为BOOK类型(构造了一个BOOK临时对象),再传递给isSameISBN函数。

隐式类类型转换还是会带来风险的,正如上面标记,隐式转换得到类的临时变量,完成操作后就消失了,我们构造了一个完成测试后被丢弃的对象。

我们可以通过explicit声明来抑制这种转换:

1

explicit BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){}

explicit关键字只能用于类内部的构造函数声明上.这样一来,BOOK类构造函数就不能用于隐式地创造对象了,编译上面的代码会出现这样的提示:

63b43d18d1f759f3ffdaa81c2959d488.png
现在用户只能进行显示类型转换,显式地创建临时对象。

总结一下:

可以使用一个实参进行调用,不是指构造函数只能有一个形参。

隐式类类型转换容易引起错误,除非你有明确理由使用隐式类类型转换,否则,将可以用一个实参进行调用的构造函数都声明为explicit。

explicit只能用于类内部构造函数的声明。它虽然能避免隐式类型转换带来的问题,但需要用户能够显式创建临时对象(对用户提出了要求)。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

1f8c2f9c4740f7a4bcbd08c7f05e1c21.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文科女生单招学计算机,文科女生走单招学什么专业好

对于文科女生来说&#xff0c;想要走高职单招选择什么专业好呢?有哪些专业适合文科女生来学习呢?有途网小编为大家整理了一些专业。语言类专业对于高职单招的专业来说&#xff0c;如今的社会发展对于纯中文的专业并不看好&#xff0c;所以说如果文科女生想要学习语言类高职单…

工程师必备:C/C 单元测试万能插桩工具

研发效能是一个涉及面很广的话题&#xff0c;它涵盖了软件交付的整个生命周期&#xff0c;涉及产品、架构、开发、测试、运维&#xff0c;每个环节都可能影响顺畅、高质量地持续有效交付。在腾讯安全平台部实际研发与测试工作中我们发现&#xff0c;代码插桩隔离是单元测试工作…

这才是你想要的C语言学习路线!

点击上方蓝字关注我&#xff0c;了解更多咨询作为一门古老的编程语言&#xff0c;大家熟知它不仅是因为拥有48年的发展历程&#xff0c;更主要还是因为当下大部分程序员走入编程世界第一个学习的语言就是C语言。而近年来高速发展的物联网和智能设备&#xff0c;又把C语言推向了…

html流式布局插件,Jquery瀑布流网格布局插件

插件描述&#xff1a;一款简单且高度可定制的jQuery瀑布流网格布局插件。通过该瀑布流网格插件你可以动态添加和删除各种尺寸的图片&#xff0c;定义图片宽度&#xff0c;设置网格的列数&#xff0c;或使用流式布局方式&#xff0c;甚至还可以通过URL动态添加图片。使用该瀑布流…

编程语言:C语言与Java的细致对比,你知道选谁了吗?

点击上方蓝字关注我&#xff0c;了解更多咨询1.Java与C语言各自的优势C语言是面向过程的语言&#xff0c;执行效率高;Java是面向对象的语言&#xff0c;执行效率比C语言低。C语言最关键的是比Java多了指针&#xff0c;这也说明了Java的健壮性&#xff0c;还有Java的多线程机制使…

ajax实现表单验证 html,Ajax+ajax做的表单验证

//Ajx实现异步示例&#xff0c;blur实现失去焦点触发jQuery(#formname).blur(check);function check(){alert("开始执行Ajax");//判断用户是否存在var formname jQuery("#formname").val();if(formname""){jQuery(#msgName).html(表单名称不能为…

java ee maven_针对新手的Java EE7和Maven项目–第8部分

java ee maven第一部分 &#xff0c; 第2部分 &#xff0c; 第3部分 &#xff0c; 第4部分 &#xff0c; 第5部分 &#xff0c; 第6部分 &#xff0c; 第7部分 第8部分 自上一篇文章以来&#xff0c;这一系列教程已经有很长时间了。 是时候恢复并在我们的简单项目中添加…

Python、Perl 垫底,C语言才是最环保的编程语言

点击上方蓝字关注我&#xff0c;了解更多咨询提到编程语言&#xff0c;人们第一时间想到的无非是&#xff1a;哪个编程语言简单易学&#xff0c;亦或是最挣钱等。但是编程语言功耗问题却被很多人忽视。那么作为程序员的我们如何选择编程语言&#xff0c;使其以低能耗高功效地工…

khoury计算机科学学院,东北大学Open House中国站

东北大学Open House中国站 -10月26日北京 & 10月27日上海东北大学向金吉列留学的学生发来诚挚邀请&#xff0c;欢迎您的学生前来参加东北大学于 10 月 26 日(周六)在北京 和 10 月 27 日(周日)在上海 举办的东北大学 Open House 教育展。在这两个 Open House 教育展上&…

知识分享:值得学习的C语言经典开源项目

点击上方蓝字关注我&#xff0c;了解节气咨询听上去有些荒谬&#xff0c;C语言的产生竟然源于一个失败的项目。1969年&#xff0c;通用电气、麻省理工学院和贝尔实验室联合创立了一个庞大的项目——Multics工程。该项目的目的是创建一个操作系统&#xff0c;但显然遇到了麻烦&a…

oracle idm_批准Oracle IDM中的特定Web服务

oracle idm关于Web服务端点的快速发布&#xff0c;OIM和SOA在与批准有关的场景中使用了Web服务端点- 基本内容&#xff0c;但对于初学者可能有用 。 Oracle IDM与SOA套件集成并利用其提供与批准相关的功能&#xff08;说实话&#xff0c;SOA非常丰富&#xff0c;并且也被用作W…

C语言编程笔记:关于 for循环 的那些不为人知的秘密

点击上方蓝字关注我&#xff0c;了解更多咨询好吧&#xff0c;也许你认为我在写一篇如何使用for循环的文章&#xff0c;&#xff0c;&#xff0c;&#xff0c;首先&#xff0c;我想说无论是学习C语言还是学习java的同学都能从此文中获益&#xff0c;还有&#xff0c;你确定你会…

weld焊接_玩Weld-Probe –一站式查看CDI的所有方面

weld焊接当我坐在DevConf.CZ的会议室时&#xff0c; Weld 3.0.0.Alpha4已发布 。 大约在Jozef Hartinger&#xff08; jozefhartinger &#xff09;旁边或多或少 &#xff0c;后者在共享休息前几分钟告诉我有关此最新版本的新功能的信息。 有一个特别的功能真正引起了我的注意&…

C语言:一种通用的程序设计语言

点击上方蓝字关注我&#xff0c;了解更多咨询语言是一种通用的程序设计语言。它同UNIX系统之间具有非常密切的关系。C语言是在UNIX系统上开发的&#xff0c;且无论是UNIX系统本身还是其上运行的大部分程序&#xff0c;都是C语言编写的。但是C语言并不受限于任何一种操作系统或机…

可禁用计算机服务,win10哪些服务可以禁用 服务哪些可以禁止启动

win10服务哪些可以禁止启动&#xff1f;方法一&#xff1a;命令方法首先使用 Windows R 组合快捷键打开“运行”窗口&#xff0c;之后键入 services.msc 按下回车键&#xff0c;即可打开“服务”。方法二&#xff1a;快捷方式法在Win10桌面的“此电脑”图标上点击鼠标右键&…

如何用最短的时间学会C语言,并掌握C语言的精髓所在?

点击上方蓝字关注我&#xff0c;了解更多咨询及C语言&#xff0c;我想凡是学过它的朋友都有这样一种感觉&#xff0c;那就是“让我欢喜让我忧。”欢喜的是&#xff0c;C语言功能非常强大、应用广泛&#xff0c;一旦掌握了后&#xff0c;你就可以理直气壮地对他人说“我是电脑高…

apache fop_Apache FOP与Eclipse和OSGi的集成

apache fopApache FOP是由XSL格式化对象&#xff08; XSL-FO &#xff09;驱动的开源打印处理器。 例如&#xff0c;将数据对象转换为PDF可能非常有用。 但是&#xff0c;事实证明&#xff0c;将其集成到PDE中并最终以OSGi Service的形式启动和运行有点麻烦。 因此&#xff0c…

2022年最值得学习的 5 种编程语言,你有在学习吗?

点击上方蓝字关注我&#xff0c;了解更多咨询作为一个初学者电脑程序员&#xff0c;很多人都会想知道当下主流的编程语言有哪些&#xff0c;哪些行业和公司都在用它们&#xff0c;因为这些信息可以帮助你了解想要学习的内容&#xff0c;使你更接近最终想用代码完成的事情。今天…

wildfly mysql_MySQL作为Kubernetes服务,可从WildFly Pod访问

wildfly mysqlKubernetes上使用Vagrant的Java EE 7和WildFly&#xff08;技术提示&#xff03;71&#xff09;介绍了如何在使用Kubernetes和Docker托管的WildFly上运行琐碎的Java EE 7应用程序。 Java EE 7应用程序是在世界范围内交付的动手实验室 。 它使用与WildFly捆绑在一起…

想学C语言?这些你一定要知道

点击上方蓝字关注我&#xff0c;了解更多咨询首先&#xff0c;你想运行自己的C语言程序&#xff0c;就必须要有一个IDE&#xff08;集成式开发工具&#xff09;。不然想运行程序很难。这里有两个方法可以运行你的C语言程序&#xff0c;一个是在菜鸟网站上云运行C语言程序&#…