2015-03-27 10 views
0

Я прочитал некоторые примеры кода в книге 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; 
}; 
+3

«Параметр» - это указатель, а не строка. – chris

+0

Я не знаю контекста этого примера в вашей книге, но помните, что в общем коде вы не должны видеть 'new std :: string', вместо этого просто используйте строку напрямую. –

ответ

4

Выражение new создает пространство для std::string в куче и возвращает указатель на него. Следовательно, это не строка, с которой инициализируется ps, а указатель на строку, для которой ps является типом.

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 «s члена std::string*.

Поэтому код: HasPtr (Const HasPtr & р): пс (новый станд :: строка (* p.ps)), я (р) {}

Является ли использование std::string copy constructor для инициализации динамически созданный std::string, который будет назначен this->ps конструктором копирования HasPtr.

Смежные вопросы