C++ Primer 393页隐式类类型详解

在C++ Primer的第393页提出了隐式类类型
注解里面有一句话:“可以用单个参数来调用的构造函数定义了从形参类型到类类型的一个隐式转换。
还是拿书上的例子来说事
class Sales_item{
public:
Sales_item(const std::string &book=""):
isbn(book),units_sold(0),revenue(0.0){ }---------------------(1)
Sales_item(std::istream &is);
};

上面的程序片段中定义了两个构造函数,他们都只有一个参数。
而后书上说
string null_book="9-999-99999-9";
item.same_isbn(null_book);--------------------------------------------------(2)

其实真正的隐式转换发生在item.same_isbn(null_book);这里,具体分析如下
首先来看看成员函数same_isbn的定义
bool same_isbn(const Sales_item &rhs) const
{ return isbn == rhs.isbn; }-------------------------------------------(3)

仔细观察可以发现成员函数same_isbn的形参类型是Sales_item,但是(2)语句中实参却是string,这样本来应该是错误的,但是编译器在这里就自作聪明了,在(1)中构造函数可以用一个string实参来创建一个Sales_item对象,所以在(2)中,null_book这个string调用了构造函数(1)创建了一个临时的对象,这个对象成了(2)的参数,整个这个过程就是隐式类类型转换。
所以(2)等价于item.same_isbn(Sales_item(null_book));
为了防止这样的问题发生,引进了explicit(明确的)来抑制。
呵呵,写完了。。。
多指教。
另外,贴上C++ Primer第四版中英文对照的资源
[url]http://www.54rk.cn/d/Cpp_Primer4rd/toc.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值