`
lc52520
  • 浏览: 361422 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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第四版中英文对照的资源
http://www.54rk.cn/d/Cpp_Primer4rd/toc.html
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics