直接初始化指针

时间:2015-03-27 15:35:51

标签: c++ initialization

我在C ++ Primer一书中读到了一些示例代码:

我不明白指针的直接初始化如何在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;
};

2 个答案:

答案 0 :(得分:4)

new表达式为堆上的std::string创建空间并返回指向它的指针。因此,它不是ps用字符串初始化的字符串,而是指向字符串的指针,ps是一种类型的。

答案 1 :(得分:1)

HasPtr::psstd::string*

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

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

如果我*p.ps我会std::string成员p指向std::string*

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

正在使用std::string copy constructor初始化动态创建的std::stringthis->ps将由HasPtr副本构造函数分配给{{1}}。