Вопрос

Учитывая следующее:

class ParamClass {...};

class MyObject {
public:
    void myMethod(ParamClass const& param) { _myPrivate = param; }

private:
    ParamClass _myPrivate;
}

[...]

MyObject obj;

void some_function(void)
{
    ParamClass p(...);
    obj.myMethod(p);
}

Что будет с _myprivate в конце срока службы объекта P? РЕДАКТИРОВАТЬ: Смогу ли я использовать _myprivate для доступа к копии объекта P?

Спасибо!

Дэн

Это было полезно?

Решение

С _myPrivate является нет Ссылка в присвоении _myPrivate = param, param указывает на то, что в этом случае является локальной переменной p в some_function().

Так Если оператор назначения для ParamClass реализуется правильно, код должен быть в порядке.

Смогу ли я использовать _myprivate для доступа к копии объекта P?

С приведенным выше предостережением, да. Но быть точным, _myPrivate нельзя использовать для доступ копия p; Это является переменная, содержащая копию данных в (теперь вымерший) p.

Другие советы

в myMethod вы призываете оператора назначения ParamClass который по умолчанию делает чучевую копию объекта (вы можете определить своего собственного оператора). Таким образом, вы создаете копию P, которая будет доступна

Ссылка похожа на псевдоним объекту. Ссылка не имеет своей жизни. Срок службы срок службы - это время жизни объекта.

В вашем примере _myprivate-это объект, поэтому оператор = скопирует перепроданный objet p. P будет уничтожена, и ссылка на параметр ничего не будет ссылаться на то, что копия будет в порядке.

Было бы проблемой, если бы _myprivate объявлено:

ParamObject& _myPrivate;

В этом случае вы получите «свисание» ссылки: неопределенное поведение :)

my2c

Взгляни на:

_myPrivate = param;

В этом операторе оператора (оператор назначения (ParamClass::operator=) копирует значения каждого члена объекта, упомянутого param в члены _myPrivate. Анкет Когда some_function возвращается, p перемещается из стека - он исчезает. Но _myPrivate теперь содержит копии pЗначения членов.

Если ParamClass Имеет участники, которые являются указателями на динамически распределенную память, вы должны убедиться, что ParamClass::operator= выполняет глубокая копия, в противном случае у вас могут быть проблемы с висящими указателями - ParamClassДестатель может освободить эту память, но _myPrivate У него будет участник, который все еще указывает на него!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top