【发布时间】:2013-04-06 11:16:52
【问题描述】:
我已经写c 好几年了,只是为了一些需要而进入c++! 我的书是C++ Primer 5/e,到了关于构造函数转换的话题,遇到了一些问题
在 C++ 中,我们有多种类型的转换。 像 static_cast、dynamic_cast 一样,我们也有类似函数的转换,它是一种显式转换。
class Sales_data{
public:
//C++11 feature,ask compiler to create a default constructor for us
Sales_data() = default;
Sales_data(const std::string &s, unsigned n, double p):
bookNo(s), units_sold(n), revenue(p*n);
explicit Sales_data(const std::string &s): bookNo(s){}
explicit Sales_data(std::istream&);
Sales_data combine(const Sales_data &item);
private:
std::string bookNo; // implicitly initialized to the empty string
unsigned units_sold;
double revenue;
};
std::string s 是一个 ISBN。 第四个从标准输入读取 ISBN
我知道没有明确的,以下陈述是合法的。
item.combine(string("ISBN NUMBER"));
item.combine(cin);
//error: need two conversion const char *->temporary string-> temporary Sales_item
item.combine("ISBN NUMBER");
我只是不明白使最后两个构造函数显式有什么好处?
http://www.cplusplus.com/reference/vector/vector/vector/
我不明白为什么某些向量的构造函数被声明为显式?是什么原因?
【问题讨论】:
-
Em,因为当一个人说
do_something(5)时,他们的意思是传递一个包含 5 个元素的向量真的很奇怪? -
您的“合法”声明都不合法,因为您无法将临时绑定到
combine()中的非 constSales_data引用。 -
@chris 他们在我看来都是合法的......第一个将临时传递给 const-ref,第二个通过引用传递非临时 (cin)。
-
@maditya,
combine()采用非常量引用,该引用被函数调用中构造的临时变量填充。 -
@chris 哇,我的错……我在看构造函数,没有注意到你指的是
combine。
标签: c++ class c++11 constructor type-conversion