【问题标题】:What does this constructor do?这个构造函数是做什么的?
【发布时间】:2019-11-18 11:02:09
【问题描述】:

你能解释一下这些台词吗?

class HasPtr {
public:
    HasPtr(const std::string &s = std::string())://this line
    ps(new std::string(s)), i(0) { } //and this

    HasPtr(const HasPtr &p):
    ps(new std::string(*p.ps)), i(p.i) { }

    HasPtr& operator=(const HasPtr &);

    ~HasPtr() { delete ps; }

private:
    std::string *ps;
    int  i;
};

本书中的这个主题是关于行为类似于值的类。

【问题讨论】:

标签: c++ class constructor default-arguments


【解决方案1】:

在这个构造函数的声明中

HasPtr(const std::string &s = std::string())://this line
ps(new std::string(s)), i(0) { }

这里使用了默认参数std::string() 和mem-initializer 列表

ps(new std::string(s)), i(0)

即在将控件传递给构造函数体之前执行。由于在 body 中没有什么可做的,所以构造函数的 body 是空的。

所以你可以在没有参数的情况下调用构造函数

HasPtr obj;

在这种情况下,像string() 这样创建的空字符串将用作参数。

【讨论】:

  • “mem-initializer”是“member-initializer”?
  • @Konstantin 这是一个用于初始化类成员的 C+ 构造。
  • 这个词其实就是ctor-initializer
  • @LightnessRaceswithMonica 来自 C++ 标准 ctor-initializer: : mem-initializer-list :)
  • mem-initializer-listctor-initializer 的一部分,是的。 :)
【解决方案2】:

const std::string &s 是对 std::string 的 const 实例的引用。

= std::string() 是默认值。 xyz()value-initialized 实例的语法 xyz

因此,当 HasPtr 在没有参数的情况下被实例化时(例如 HasPtr()),HasPtr(s) 构造函数将被调用,s 绑定到 临时 空白 std::string 实例(其中直到完整表达式结束,通常是第一个 ;)。

然后ps将被new std::string(s)初始化,在堆上复制s并将指向它的指针存储在ps中。

如果使用实际参数调用HasPtr,则= std::string() 部分将不会执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-10
    • 2018-04-22
    • 1970-01-01
    • 2016-12-15
    • 2017-12-08
    • 1970-01-01
    • 2013-07-28
    • 2012-04-29
    相关资源
    最近更新 更多