1

我已经写 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/

我不明白为什么某些向量的构造函数被声明为显式?是什么原因?

4

1 回答 1

3

explicit禁止调用构造函数进行自动转换。构造函数仍然可以用作普通构造函数。是的,该语言应该被设计为explicit默认具有构造函数并注释(implicit?)转换构造函数......但这就是故事的发展方式。

标记为显式的原因,std::vector<T>::vector(int)例如是为了禁止以下代码:

void do_fancy_stuff(const std::vector<std::string> &data);

do_fancy_stuff(20);

如果向量构造函数不是显式的,它将用于将 20 个空字符串转换int为 a vector,这没有什么意义。

编写构造函数时的一般想法TypeA::TypeA(TypeB x)是想知道:“这个构造函数是将 转换TypeBaTypeA还是仅用x作单个参数?如果是后者,请添加explicit.

于 2013-04-14T07:14:09.520 回答