(при условии, что obj2
должно быть obj1
)
ClassA *x
определяет указатель , который может указывать на объекты типа ClassA
. Указатель не сам объект.
new ClassA
выделяет (и создает) фактический объект типа ClassA
.
Таким образом, строка Class A *obj1 = new ClassA;
определяет указатель obj1
, а затем устанавливает его так, чтобы он указывал на вновь выделенный объект типа ClassA
.
Строка Class A *ptr1 = obj1;
определяет указатель ptr1
, а затем устанавливает его так, чтобы он указывал на то же самое, на что obj1
указывает, то есть на объект ClassA
, который мы только что создали.
После строки Class A *ptr2 = obj1;
у нас есть три указателя (obj1
, ptr1
, ptr2
), все они указывают на один и тот же объект.
Если мы сделаем delete ptr1;
(или, что эквивалентно, delete obj1;
или delete ptr2;
), мы уничтожим указанный объект. После этого любой указатель, указывающий на объект, становится недействительным (что отвечает на ваш первый вопрос: да, это повлияет на ptr2
в том смысле, что ptr2
впоследствии не будет указывать на действительный объект).
Правильное решение зависит от того, чего вы пытаетесь достичь:
- Если вам нужны две копии объекта, предполагая, что
ClassA
имеет конструктор копирования, выполните ClassA *ptr2 = new ClassA(*obj1);
. Вам нужно будет delete
этот новый объект отдельно, когда вы закончите с ним!
- Если вам нужны два указателя на один и тот же объект, рассмотрите возможность использования что-то вроде
boost::shared_ptr
(Google google)
Хм, это много текста для такого простого q + a. Ах, хорошо.