C 隐式类型转换是什么?

发布时间:2024-04-21 点击:73
c 中隐式类型转换是指:从“构造函数形参类型”到“该类类型”的一个编译器的自动转换。隐式类类型转换是会带来风险的,隐式转换得到类的临时变量,完成操作后就消失了,我们构造了一个完成测试后被丢弃的对象。
c 隐式类类型转换
《c primer》中提到:
“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”
这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的。
那么,什么是“隐式转换”呢? 上面这句话也说了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换。
下面通过代码来看一看:
#include "stdafx.h"#include <string>#include <iostream>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)<<endl; //正经地进行比较,无需发生转换 cout<<a.issameisbn(string("a-a-a"))<<endl; //此处即发生一个隐式转换:string类型-->book类型,借助book的构造函数进行转换,以满足issameisbn函数的参数期待。 cout<<a.issameisbn(book("a-a-a"))<<endl; //显式创建临时对象,也即是编译器干的事情。 system("pause");}代码中可以看到,issameisbn函数是期待一个book类类型形参的,但我们却传递了一个string类型的给它,这不是它想要的啊!还好,book类中有个构造函数,它使用一个string类型实参进行调用,编译器调用了这个构造函数,隐式地将stirng类型转换为book类型(构造了一个book临时对象),再传递给issameisbn函数。
隐式类类型转换还是会带来风险的,正如上面标记,隐式转换得到类的临时变量,完成操作后就消失了,我们构造了一个完成测试后被丢弃的对象。
我们可以通过explicit声明来抑制这种转换:
explicit book(string isbn,float price=0.0f):_bookisbn(isbn),_price(price){}explicit关键字只能用于类内部的构造函数声明上.这样一来,book类构造函数就不能用于隐式地创造对象了,编译上面的代码会出现这样的提示:
现在用户只能进行显示类型转换,显式地创建临时对象。
总结一下:
可以使用一个实参进行调用,不是指构造函数只能有一个形参。
隐式类类型转换容易引起错误,除非你有明确理由使用隐式类类型转换,否则,将可以用一个实参进行调用的构造函数都声明为explicit。
explicit只能用于类内部构造函数的声明。它虽然能避免隐式类型转换带来的问题,但需要用户能够显式创建临时对象(对用户提出了要求)。
推荐:《c 教程》

网站备案是什么意思 个人网站怎么备案
做好SEO优化提升网站排名的方法
一个公司建设网站的优势有哪些?
网站定制公司有哪些好处,你了解多少?
便宜云闪科技服务器
香港云服务器托管租用
网站建站的费用一般要多少?大概涉及到哪些方面?
怎么在云服务器上挂qq