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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
myxolod
0 / 0 / 0
Регистрация: 24.03.2015
Сообщений: 9
#1

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

07.07.2015, 16:50. Просмотров 256. Ответов 4
Метки нет (Все метки)

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 на рандомные значения, после изменения возвращаемого значения оператора+ на объект, а не ссылку работает нормально, как я лично понял что он делает ссылку на локальный объект который уничтожается после выхода из конструктора, так ли это, и если кто мог бы по подробней расписать этот нюанс использования ссылок в возврате, или ссылку ?
0
Миниатюры
Разъясните ситуацию с возвратом объекта или ссылки на объект   Разъясните ситуацию с возвратом объекта или ссылки на объект  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2015, 16:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разъясните ситуацию с возвратом объекта или ссылки на объект (C++):

Разъясните ситуацию с видимостью объекта - C++
В общем узнал что внутри классов можно описывать структуры, подклассы и т.д. и т.п. Вроде удобно, решил использовать это. При попытке...

Разъясните ситуацию с ссылками. - C++
#include <iostream.h> void main(void) { int x=777; int &ir = x; double &dr=x; cout<<" x = "<<x<<endl; ...

Функция get() разъясните ситуацию - C++
#include<iostream> #include<fstream> using namespace std; int main() { setlocale(LC_CTYPE, "russian"); char...

Функция с возвратом указателя и возвратом ссылки - C++
Найти максимальный и минимальный элемент в двумерном массиве и указать их номера. Указать номер первого отрицательного числа в массиве;...

выделить место для объекта с помощью new или создать указатель, объект и присвоить один другому. какая разница? - C++
кроме того что к объекту созданному с помощью new можно будет обращаться только через указатель.

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект - C++
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня , так как учусь работать с указателями)...

4
nmcf
5324 / 4644 / 1553
Регистрация: 14.04.2014
Сообщений: 18,479
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;
}
0
DrOffset
7321 / 4421 / 1001
Регистрация: 30.01.2014
Сообщений: 7,259
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 уже мертва. А вывод, используя указатель, здесь есть ни что иное как некромантия. А некромантия, как известно, прилично выглядит только если труп еще свежий. Пройди чуть больше времени, и зрелище уже будет не столь приятным.
Надеюсь метафора понятна.
2
myxolod
0 / 0 / 0
Регистрация: 24.03.2015
Сообщений: 9
08.07.2015, 19:39  [ТС] #4
А вот когда мы возвращаем объект, почему он не уничтожается, и когда он будет уничтожатся, или как это сделать? Ведь он тоже является локальным объектом ?
0
DrOffset
7321 / 4421 / 1001
Регистрация: 30.01.2014
Сообщений: 7,259
08.07.2015, 22:00 #5
Цитата Сообщение от myxolod Посмотреть сообщение
А вот когда мы возвращаем объект, почему он не уничтожается, и когда он будет уничтожатся, или как это сделать?
Уничтожается локальный объект, а снаружи функции ты получаешь его копию. Но. Компиляторы, если есть возможность, оптимизируют это и не делают лишнего копирования (отсюда эффект, что объект не уничтожается).
Подробнее тут и тут.
Важно понять, что есть правила языка, а есть оптимизации компилятора. Конструктор копирования при возврате по значению в реальности может не вызываться никогда (это результат оптимизации), но если вдруг его запретить (например поместить в секцию private), то код перестанет копилироваться (это правила языка).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2015, 22:00
Привет! Вот еще темы с ответами:

Может ли объект-член, или объект-элемент достучаться к содержащему его? - C++
Предположим, class A { ... }; class B { .... A a; ... };

Основы: указатель на объект или объект, что выбрать? - C++
Не до конца понимаю (или вообще не понимаю) когда лучше использовать указатель на объект, а когда объект. Например: // есть класс ...

Ссылки на объект и мультипоточность - C++
Такая проблема: есть два потока и глобально объявленная ссылка на объект, когда я инициализирую её в одном потоке, во втором она остаётся...

Возвращение ссылки на локальный объект - C++
В каком-то коде мельком видел что-то вроде: char&amp; char_stub() { char c; return c; }; int main() {


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
08.07.2015, 22:00
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru