心理健康网站建设论文,英文网站seo推广,西安小程序,小城市做网站C 隐式类类型转换《C Primer》中提到#xff1a;“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”这里应该注意的是#xff0c; “可以用单个形参进行调用” 并不是指构造函数只能有一个形参#xff0c;而是它可以有多个形参#xff0… 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 price0.0f):_bookISBN(ISBN),_price(price){}}; int main(){ BOOK A(A-A-A); BOOK B(B-B-B); couta.issameisbn(b) couta.issameisbn(string(a-a-a))BOOK类型借助BOOK的构造函数进行转换以满足isSameISBN函数的参数期待。 couta.issameisbn(book(a-a-a)) system(pause);}代码中可以看到isSameISBN函数是期待一个BOOK类类型形参的但我们却传递了一个string类型的给它这不是它想要的啊还好BOOK类中有个构造函数它使用一个string类型实参进行调用编译器调用了这个构造函数隐式地将stirng类型转换为BOOK类型构造了一个BOOK临时对象再传递给isSameISBN函数。隐式类类型转换还是会带来风险的正如上面标记隐式转换得到类的临时变量完成操作后就消失了我们构造了一个完成测试后被丢弃的对象。我们可以通过explicit声明来抑制这种转换:1explicit BOOK(string ISBN,float price0.0f):_bookISBN(ISBN),_price(price){}explicit关键字只能用于类内部的构造函数声明上.这样一来BOOK类构造函数就不能用于隐式地创造对象了编译上面的代码会出现这样的提示现在用户只能进行显示类型转换显式地创建临时对象。总结一下可以使用一个实参进行调用不是指构造函数只能有一个形参。隐式类类型转换容易引起错误除非你有明确理由使用隐式类类型转换否则将可以用一个实参进行调用的构造函数都声明为explicit。explicit只能用于类内部构造函数的声明。它虽然能避免隐式类型转换带来的问题但需要用户能够显式创建临时对象对用户提出了要求。声明本文于网络整理版权归原作者所有如来源信息有误或侵犯权益请联系我们删除或授权事宜。