#c #pass-by-reference #composition #copy-constructor
#c #передача по ссылке #композиция #copy-constructor
Вопрос:
Предположим, что класс MyClass имеет конструктор:
MyClass::MyClass( ... ) {
var = new OtherClass( ... );
}
и предположим, что класс OtherClass имеет конструктор копирования:
OtherClass::OtherClass(const OtherClass amp;obj) {
for (int i = 0; i < array_size; i) {
array[i] = obj.array[i];
}
}
Является ли приведенный ниже рекомендуемый способ написания конструктора копирования для MyClass?
MyClass::MyClass(const MyClass amp;obj) {
var = new OtherClass(*obj.var);
}
Я спрашиваю, потому что мне не удалось найти пример синтаксиса разыменования, используемого вышеупомянутым конструктором копирования.
Редактировать: Извините, я оставил опечатку в конструкторе копирования (введенную, когда я пытался сделать пример кода абстрактным): *obj.array
так и должно было быть *obj.var
.
Комментарии:
1. какой тип
MyClass::array
?
Ответ №1:
Нет, это действительно не имеет смысла. Что имеет смысл, так это:
MyClass::MyClass(const MyClass amp;obj) {
var = new OtherClass(*obj.var);
}
Или, скорее:
MyClass::MyClass(const MyClass amp;obj)
:var(new OtherClass(*obj.var))
{}
Комментарии:
1. Прошу прощения за опечатку. В первой части вашего предложения используется синтаксис, который я намеревался использовать, но я не рассматривал возможность использования списка инициализации элемента. Спасибо!
Ответ №2:
Предполагая, что это var
на самом деле является членом MyClass и указателем на OtherClass
, я бы написал
MyClass::MyClass(const MyClass amp;obj) : var(new OtherClass(obj.array))
{
...
}
Ответ №3:
Да, обычно рекомендуется, чтобы ctors копирования принимали const
ссылочные параметры.
Вам не нужно разыменовывать ссылку. Измените свой код на:
MyClass::MyClass(const MyClass amp;obj) {
var = new OtherClass(obj.array);
}
Комментарии:
1. -1: Не используется конструктор копирования другого класса (var, а не array)
2. @Martin: ctor copt, на который я ссылался, является
MyClass
‘s3. Так почему бы не использовать конструктор копирования другого класса?
4. Извините за опечатку (
obj.array
а неobj.var
) — которая, к сожалению, скопирована в приведенном выше ответе. Посколькуobj.var
это указатель, аOtherClass
конструктор копирования ожидает объект (на который он создает постоянную ссылку), я полагаю, что я должен разыменоватьobj.var
.