Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613

Создаются ли копии объектов при операции присваивания?

08.04.2017, 17:40. Показов 1181. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Допустим есть объекты одного класса a1, a2, a3.
Насколько я понимаю, при операции присваивания a1=a2 создаётся копия объекта a2 и значения копируются в объект a1.
Что происходит при операции a1=a2=a3? Создаются две копии объектов для a1 и a2?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2017, 17:40
Ответы с готовыми решениями:

Создаются копии существующих файлов
Здравствуйте, уважаемые! По роду деятельности я 1с-ник, так что сильно не пинайте Суть... стоит у меня дома сервак с win2003 x64 на...

Создаются копии существующих файлов
Здравствуйте, уважаемые! По роду деятельности я 1с-ник, так что сильно не пинайте :) Суть... стоит у меня дома сервак с win2003 x64 на...

Где ошибка в коде по кешированию (создаются копии)
<?php // раздел настроек, которые вы можете менять $cachedir = $_SERVER.'/cache/'; $cachetime = 3600; //время жизни кэша (1 час) ...

18
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.04.2017, 17:46
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
Насколько я понимаю, при операции присваивания a1=a2 создаётся копия объекта a2 и значения копируются в объект a1.
Обычно, в классах имеется оператор присваивания подобного вида:
C++
1
2
3
4
5
6
7
class SomeClass {
public:
   SomeClass &operator=(const SomeClass &rhv) {
      //код корректного копирования данных из rhv в данный объект (*this)
      return *this;
   }
};
код a1=a2 развернется в a1.operator=(a2);,
т.е. никаких "фантомных" копий не создается,
хотя всё зависит от того, как Вы
организовали оператор присваивания для класса.
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
Что происходит при операции a1=a2=a3?
Развернется соответственно в a1.operator=(a2.operator=(a3));
1
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
08.04.2017, 19:20  [ТС]
Вот выдержка из книги Лафоре
Как вы уже успели заметить, функция может возвращать результат в вызывающую программу по значению или по ссылке. При возвращении по значению происходит фактически передача результата, а значит, создается копия объекта, которая и возвращается в программу. В вызывающей программе этот вновь созданный объект может присваиваться какому-либо другому объекту или использоваться как-то еще, это уже не так важно. Если же возвращение происходит по ссылке, никакой новый объект не создается. Ссылка на исходный объект — вот и все, что возвращается в качестве результата.
Функция operator=() возвращает результат путем создания временного объекта alpha и его инициализации с помощью одноаргументного конструктора в выражении

[CPP]return alpha(data);//alpha это класс, int data элемент класса/CPP]
Возвращаемое значение — это копия исходного, а не тот же самый объект, чьим методом является перегружаемая операция =. Такой стиль возвращения значений позволяет выстраивать эти функции в цепочку:
a3 = a2 = a1;

Тут и вопрос возник: сколько копий объекта создаётся при такой цепочке присваиваний a3 = a2 = a1?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
08.04.2017, 19:42
Fatmarmelad, если из operator=() будешь возвращать ссылку то копий не создается, если будешь вызывать конструктор
C++
1
return alpha(data);//alpha это класс, int data элемент класса
то на каждый возврат по одному временному объекту.
1
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
08.04.2017, 20:00  [ТС]
Цитата Сообщение от _stanislav Посмотреть сообщение
если из operator=() будешь возвращать ссылку
вот что я прочитал

А можем мы вернуть результат по ссылке, используя описатель, показанный ни- же, для перегружаемого присваивания?
alpha& operator=(аlpha& а) // Неудачная мысль
К сожалению, нет, мы не можем осуществить возврат результата по ссылке при работе с локальными переменными данной функции.
Напомним, что локальные переменные, то есть созданные внутри функции и не объявленные статическими, уничтожаются при выходе из функции. Но, как мы знаем, возвращение по ссылке передает в вызывающую программу только адрес данных, который для локальных переменных указывает на данные, находящиеся внутри функции. При возврате из функции указатель хранит уже какое- то не имеющее смысла значение. Компилятор может сигнализировать о такой ситуации предупреждением.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.04.2017, 20:31
Fatmarmelad, из operator=, как правило,
возвращается ссылка на текущий объект,
а не на какой-то левый локальный.
Как там у Лафоре оно организуется - понятия не имею.
Но даже по логике при присваивании не нужны бесполезные копии.
Приведите код того самого класса из книги Лафоре,
посмотрим что там понаписюкано.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
08.04.2017, 20:33
Fatmarmelad, ну и что, локальные переменные бог с ними ты же ссылку на объект возвращаешь.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.04.2017, 20:33
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
К сожалению, нет, мы не можем осуществить возврат результата по ссылке при работе с локальными переменными данной функции.
Речь идёт о локальных переменных, которые созданы внутри оператора. Всё от реализации зависит. Реализация там показана?
Если реализация такая (а обычно такая), то можно и ссылку возвращать:
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
3
4
5
6
7
class SomeClass {
public:
   SomeClass &operator=(const SomeClass &rhv) {
      //код корректного копирования данных из rhv в данный объект (*this)
      return *this;
   }
};
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
08.04.2017, 20:43
так ты в деструктор кинь cout<<"delet obj"; тоисть можно проследить сколько раз вызывается деструктор столько и объектов, тоисть если копия создаеться то деструктор ее удалит и мы увидим что она есть.
0
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
08.04.2017, 22:47  [ТС]
Речь идёт о перегрузке оператора присваивания
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;
class alpha
{
private:
int data;
public:
alpha() // конструктор без аргументов
{ }
alpha(int d) // конструктор с одним аргументом
{ data = d; }
void display() // вывести данные
{ cout << data; }
alpha operator=(alpha& a) // перегружаемый =
{
data = a.data; // не выполняется автоматически
cout << "\nЗапущен оператор присваивания";
return alpha(data); // возвращает копию alpha
}
};
int main()
{
alpha a1(37);
alpha a2;
a2 = a1; // запуск перегружаемого =
cout << "\na2 ="; a2.display(); // вывести a2
alpha a3 = a2; // НЕ запускается =
cout << "\na3 ="; a3.display(); // вывести a3
cout << endl;
return 0;
}
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.04.2017, 23:02
С таким оператором, так уже не напишешь:
C++
1
2
3
    alpha a1(37);
    alpha a2, a3;
    a3 = a2 = a1;
Значит - это плохая перегрузка.
0
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
08.04.2017, 23:10  [ТС]
nd2, в этом коде у оператора можно возврат по ссылке делать?
И просто интересно при присваивании a3 = a2 = a1; две копии создаются: и для a2, и для a3?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.04.2017, 23:13
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
в этом коде у оператора можно возврат по ссылке делать?
Нет. Это у Лафоре такой пример?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.04.2017, 23:15
Fatmarmelad, на кой макар там делается копия,
из-за которой всё становится криво - не ясно.
C++
1
2
3
4
5
alpha &operator=(const alpha& a) // перегружаемый =
{
data = a.data;
return *this;
}
А вообще здесь хватит и генерируемого
компилятором оператора присваивания.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.04.2017, 23:19
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
C++
1
alpha a3 = a2; // НЕ запускается =
Тут неявный конструктор копирования работает, а не оператор присваивания.

Добавлено через 2 минуты
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
И просто интересно при присваивании a3 = a2 = a1; две копии создаются: и для a2, и для a3?
Копий создаётся столько сколько знаков равно, только куда эти копии засунуть?
Цитата Сообщение от Croessmah Посмотреть сообщение
на кой макар там делается копия,
из-за которой всё становится криво - не ясно.
0
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
08.04.2017, 23:36  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Нет. Это у Лафоре такой пример?
да это пример из книги Лафоре

Цитата Сообщение от Croessmah Посмотреть сообщение
return *this;
Тема *this будет ещё впереди.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.04.2017, 23:40
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
да это пример из книги Лафоре
На какой странице?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.04.2017, 23:44
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
Тема *this будет ещё впереди.
Наверное тогда Вам и объяснят что к чему.
0
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
08.04.2017, 23:55  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
На какой странице?
503 стр
Листинг 11.16. Программа ASSIGN
// assign.cpp
// перегрузка операции присваивания (=)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.04.2017, 23:55
Помогаю со студенческими работами здесь

В system32 создаются копии файлов с добавлением расширения *.tmp
В папке system32 некоторые файлы повторяются,и к ним добавляется расширение tmp (asycfilt.dll.tmp asycfilt.dll)

Операции присваивания
Как можно проиллюстрировать возможности операций присваивания на примере программы?

Переопределение операции присваивания
В случае, когда в классе есть члены, память под которые выделяется динамически, операцию присваивания, как и конструкторы с деструкторами...

Переопределение операции присваивания
Есть вот такой класс: #ifndef cd_h #define cd_h class Cd { private: char* performance; char* label; int selections;

Операции присваивания и сравнения
Почему в Visual Basic нельзя иметь вот такую конструкцию? Dim a As Integer Dim b As Integer Dim c As Integer a = b = c = 7 ...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru