指针的直接初始化

Direct initialization of a pointer

我在《C++ 入门》一书中阅读了一些示例代码:

我不明白在 ps(new std::string(s))ps(new std::string(*p.ps)) 中指针的直接初始化是如何工作的。 如果 ps 是指向字符串的指针,那么为什么可以将字符串作为其直接初始化构造函数中的参数?

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

   // each HasPtr has its own copy of the string to which ps points
   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;
};

new 表达式为堆上的 std::string 创建 space 并 returns 指向它的指针。因此,它不是 ps 初始化的字符串,而是指向字符串的指针,ps 是.

的一种类型

HasPtr::psstd::string*.

如果我像这样取消引用 std::string* *ps,我会得到实际的 std::string 对象。

如果我有一个对象 const HasPtr p,我可以使用 p.ps 获取它的指向 std::string 的成员指针。 这只可能在 class HasPtr 内,因为 psprivate

如果我这样做 *p.ps 我将得到 p 的成员 std::string* 指向的 std::string

所以代码: HasPtr(const HasPtr &p): ps(新std::string(*p.ps)), i(p.i) {}

正在使用 std::string copy constructor 初始化将由 HasPtr 复制构造函数分配给 this->ps 的动态创建的 std::string