Форум программистов, компьютерный форум CyberForum.ru

Разъясните ситуацию с возвратом объекта или ссылки на объект - C++

Восстановить пароль Регистрация
 
myxolod
0 / 0 / 0
Регистрация: 24.03.2015
Сообщений: 9
07.07.2015, 16:50     Разъясните ситуацию с возвратом объекта или ссылки на объект #1
C++
1
2
3
4
CValue my_f(15, false);
    CValue my_t(5, false);
        ...
        my_f = my_t + 2;
Переопределение операторов сложения и присвоения:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CValue& CValue::operator+(int a)
{
    return CValue(value + a, flag);
}
...
CValue CValue::operator=(const CValue& aVal) 
{
    int a = 0;
    a++;
    if (this == &aVal)
        return *this;
    this->value = aVal.value;
    this->flag = aVal.flag;
    return *this;
}
В дебагере при входе в оператор =, aVal {flag = false, value = 7}(рис 1), следующий шаг меняет flag и value на рандомные значения, после изменения возвращаемого значения оператора+ на объект, а не ссылку работает нормально, как я лично понял что он делает ссылку на локальный объект который уничтожается после выхода из конструктора, так ли это, и если кто мог бы по подробней расписать этот нюанс использования ссылок в возврате, или ссылку ?
Миниатюры
Разъясните ситуацию с возвратом объекта или ссылки на объект   Разъясните ситуацию с возвратом объекта или ссылки на объект  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2015, 16:50     Разъясните ситуацию с возвратом объекта или ссылки на объект
Посмотрите здесь:

Обращение к методам объекта по ссылке на объект C++
Разъясните ситуацию с ссылками. C++
C++ выделить место для объекта с помощью new или создать указатель, объект и присвоить один другому. какая разница?
при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! C++
Ссылка на объект не указывает на экземпляр объекта C++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,688
07.07.2015, 20:55     Разъясните ситуацию с возвратом объекта или ссылки на объект #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CValue CValue::operator + (int a)
{
    return CValue(value + a, flag);
}
...
CValue& CValue::operator=(const CValue& aVal) 
{
    int a = 0;
    a++;
    if (this == &aVal)
        return *this;
    this->value = aVal.value;
    this->flag = aVal.flag;
    return *this;
}
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
07.07.2015, 22:29     Разъясните ситуацию с возвратом объекта или ссылки на объект #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от myxolod Посмотреть сообщение
как я лично понял что он делает ссылку на локальный объект который уничтожается после выхода из конструктора, так ли это
Так. Только тут не просто локальный объект, а временный объект и он уничтожится в конце выражения return.
Более того, если бы компилятор в данном вопросе придерживался правил С++, а не собственных расширений, то вообще не позволил бы скомпилировать этот код.
Вот аналогичный пример в gcc: http://rextester.com/LHRK19536 и он обоснованно не компилируется.

Цитата Сообщение от myxolod Посмотреть сообщение
нюанс использования ссылок в возврате
Никаких нюансов тут нет. Нужно просто иметь представление сколько живут объекты в программе. Если мы сохраняем ссылку на объект, время жизни которого меньше, чем требуется, то при доступе посредством этой ссылки получаем закономерные спецэффекты (или, что более страшно, отсутствие таковых). Дело здесь не в возврате, а именно в понимании времени жизни своих объектов.
Вот похожий пример без всяких функций.
C++
1
2
3
4
5
6
   int * p;
   {
        int v = 2;
        p = &v;
   }
   std::cout << *p;
Хоть в данном случае, вероятнее всего, ничего страшного не будет заметно, но все-таки этот код некорректен, потому что переменная v уже мертва. А вывод, используя указатель, здесь есть ни что иное как некромантия. А некромантия, как известно, прилично выглядит только если труп еще свежий. Пройди чуть больше времени, и зрелище уже будет не столь приятным.
Надеюсь метафора понятна.
myxolod
0 / 0 / 0
Регистрация: 24.03.2015
Сообщений: 9
08.07.2015, 19:39  [ТС]     Разъясните ситуацию с возвратом объекта или ссылки на объект #4
А вот когда мы возвращаем объект, почему он не уничтожается, и когда он будет уничтожатся, или как это сделать? Ведь он тоже является локальным объектом ?
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
08.07.2015, 22:00     Разъясните ситуацию с возвратом объекта или ссылки на объект #5
Цитата Сообщение от myxolod Посмотреть сообщение
А вот когда мы возвращаем объект, почему он не уничтожается, и когда он будет уничтожатся, или как это сделать?
Уничтожается локальный объект, а снаружи функции ты получаешь его копию. Но. Компиляторы, если есть возможность, оптимизируют это и не делают лишнего копирования (отсюда эффект, что объект не уничтожается).
Подробнее тут и тут.
Важно понять, что есть правила языка, а есть оптимизации компилятора. Конструктор копирования при возврате по значению в реальности может не вызываться никогда (это результат оптимизации), но если вдруг его запретить (например поместить в секцию private), то код перестанет копилироваться (это правила языка).
Yandex
Объявления
08.07.2015, 22:00     Разъясните ситуацию с возвратом объекта или ссылки на объект
Ответ Создать тему
Опции темы

Текущее время: 03:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru