【问题标题】:About Casting in C++'s Class关于 C++ 类中的强制转换
【发布时间】: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() 中的非 const Sales_data 引用。
  • @chris 他们在我看来都是合法的......第一个将临时传递给 const-ref,第二个通过引用传递非临时 (cin)。
  • @maditya, combine() 采用非常量引用,该引用被函数调用中构造的临时变量填充。
  • @chris 哇,我的错……我在看构造函数,没有注意到你指的是combine

标签: c++ class c++11 constructor type-conversion


【解决方案1】:

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

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

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

do_fancy_stuff(20);

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

编写构造函数TypeA::TypeA(TypeB x) 时的一般想法是想知道:“这个构造函数是转换 TypeBTypeA 还是只是使用x 作为单个参数? 如果是后者,加explicit

【讨论】:

  • 谢谢@rodrigo,是否有可能在每次设计类的时候都发现这样的问题?
  • @TimHsu:好吧,寻找任何可以只用一个参数调用的构造函数,然后思考:“这是一个转换运算符吗”?如果“是”什么也不做;如果“否”添加explicit。如有疑问,只需添加即可。
猜你喜欢
  • 2017-10-05
  • 2021-06-23
  • 2014-04-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多