我在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;
};
答案 0 :(得分:4)
new
表达式为堆上的std::string
创建空间并返回指向它的指针。因此,它不是ps用字符串初始化的字符串,而是指向字符串的指针,ps是一种类型的。
答案 1 :(得分:1)
HasPtr::ps
是std::string*
。
如果我取消引用std::string*
这样*ps
,我会得到实际的std::string
对象。
如果我有一个对象const HasPtr p
,我可以使用std::string
获取p.ps
的成员指针。 这只能在class HasPtr
内实现,因为ps
是private
。
如果我*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::string
,this->ps
将由HasPtr
副本构造函数分配给{{1}}。