Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 24.03.2015
Сообщений: 9

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

07.07.2015, 16:50. Показов 1211. Ответов 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)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.07.2015, 16:50
Ответы с готовыми решениями:

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

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

Разъясните ситуацию с SP1
Решил установить SP1, установил (установка прошла успешно) После очистки, дефрагментации обьем остался таким, как и до установки. Вопрос:...

4
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
07.07.2015, 20:55
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.07.2015, 22:29
Лучший ответ Сообщение было отмечено myxolod как решение

Решение

Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 24.03.2015
Сообщений: 9
08.07.2015, 19:39  [ТС]
А вот когда мы возвращаем объект, почему он не уничтожается, и когда он будет уничтожатся, или как это сделать? Ведь он тоже является локальным объектом ?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
08.07.2015, 22:00
Цитата Сообщение от myxolod Посмотреть сообщение
А вот когда мы возвращаем объект, почему он не уничтожается, и когда он будет уничтожатся, или как это сделать?
Уничтожается локальный объект, а снаружи функции ты получаешь его копию. Но. Компиляторы, если есть возможность, оптимизируют это и не делают лишнего копирования (отсюда эффект, что объект не уничтожается).
Подробнее тут и тут.
Важно понять, что есть правила языка, а есть оптимизации компилятора. Конструктор копирования при возврате по значению в реальности может не вызываться никогда (это результат оптимизации), но если вдруг его запретить (например поместить в секцию private), то код перестанет копилироваться (это правила языка).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.07.2015, 22:00
Помогаю со студенческими работами здесь

Разъясните ситуацию с исключениями
Добрый вечер. Написал код для сортировки массива случайных чисел. Все работало отлично. Но когда я захотел добавить исключения при вооде...

Функция get() разъясните ситуацию
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; int main() { setlocale(LC_CTYPE, &quot;russian&quot;); char...

Разъясните ситуацию с регулярным выражением (пример выкладываю)
Почему код ниже выводит: true true Ведь &quot;12345&quot; не содержит букв. public class ForRegexTest { public static void...

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

Передача методу одного объекта ссылки на другой объект
Здравствуйте, совсем недавно начал изучать объектный php и возник следующий вопрос. $c = new C(args); $a = new A(); $b = new B(); ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru