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

Почему перегруженный оператор = должен возвращать ссылку на объект - C++

Восстановить пароль Регистрация
 
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
28.03.2012, 01:30     Почему перегруженный оператор = должен возвращать ссылку на объект #1
Объясните доступно пожалуйста.

Почему перегруженный оператор= должен возвращать ссылку на объект? А оператор+ может возвращать как ссылку на объект, так и сам объект?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2012, 01:30     Почему перегруженный оператор = должен возвращать ссылку на объект
Посмотрите здесь:

Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку? C++
при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! C++
C++ перегруженный оператор <<
C++ почему не работает перегруженный оператор?
C++ Перегруженный оператор вывода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.03.2012, 02:56     Почему перегруженный оператор = должен возвращать ссылку на объект #2
Цитата Сообщение от Merovingian Посмотреть сообщение
Почему перегруженный оператор= должен возвращать ссылку на объект?
перегруженный оператор= ничего никому не должен, принято возвращать ссылку чтобы операция присваивания объектов пользовательского типа, имела такую же семантику как и у стандартных типов
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.03.2012, 09:04     Почему перегруженный оператор = должен возвращать ссылку на объект #3
Цитата Сообщение от Merovingian Посмотреть сообщение
оператор+ может возвращать как ссылку на объект
Не может.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.03.2012, 10:01     Почему перегруженный оператор = должен возвращать ссылку на объект #4
Deviaphan, ну почему же, могут быть очень экзотические случаи. Скажем, он возвращает ссылку на некоторый статический объект-член класса. Но это действительно экзотика, и ни о каком сохранении семантики речи уже не идёт
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
28.03.2012, 10:11     Почему перегруженный оператор = должен возвращать ссылку на объект #5
Цитата Сообщение от Merovingian Посмотреть сообщение
Почему перегруженный оператор= должен возвращать ссылку на объект?
потому что, если он не будет возвращать ссылку на объект, то компилятор будет запускать копиконструктор, и твоя операция будет называться не присваиванием, а инициализацией. А вот когда мы возвращаем ссылку на объект, тогда копиконструктор не запускается и получается операция присваивания.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.03.2012, 10:16     Почему перегруженный оператор = должен возвращать ссылку на объект #6
gore-lykovoe, бред.
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
#include <iostream>
 
class Foo
{
public:
    Foo()
    {
    }
    
    // Оператор присваивания ничего не возвращает
    void operator=(const Foo&)
    {
        std::cout << "Foo::operator=(const Foo&)" << std::endl;
    }
    
private:
    // Конструктор копии скрыт и оставлен без реализации
    Foo(const Foo&);
};
 
int main()
{
    Foo a, b;
    
    a = b; // Вывод "Foo::operator=(const Foo&)"
    
    return 0;
}
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
28.03.2012, 10:32     Почему перегруженный оператор = должен возвращать ссылку на объект #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
бред.
да, в голове все перемешивается, когда проходишь большие темы за день((
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
28.03.2012, 14:10  [ТС]     Почему перегруженный оператор = должен возвращать ссылку на объект #8
Цитата Сообщение от Deviaphan Посмотреть сообщение
Не может.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
TString TString::operator+(const TString& s) const
{
    TString temp;
    temp.len = len + s.len;
    temp.str = new char[temp.len + 1];
    strcpy(temp.str, str);
    strcat(temp.str, s.str);
    return temp;
}
...
TString s("12");
TString s1 = s;
s = s+s1; // работает
Это работает,
А когда возвращает ссылку, то
C++
1
s = s+s1; // не работает
Но почему?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.03.2012, 14:16     Почему перегруженный оператор = должен возвращать ссылку на объект #9
Цитата Сообщение от Merovingian Посмотреть сообщение
Но почему?
Во-первых, потому что я уже предупредил, что не может (кроме исключительных случаев, упомянутых silent_1991)
Во-вторых, возвращается ссылка на локальный объект, который к моменту использования оказывается уничтоженным.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2012, 14:21     Почему перегруженный оператор = должен возвращать ссылку на объект
Еще ссылки по теме:

C++ Перегруженный оператор
C++ Difftime() должен возвращать тип double
C++ А можно в функцию, или перегруженный оператор передать ссылку на копию?

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

Или воспользуйтесь поиском по форуму:
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
28.03.2012, 14:21  [ТС]     Почему перегруженный оператор = должен возвращать ссылку на объект #10
Цитата Сообщение от Deviaphan Посмотреть сообщение
Во-вторых, возвращается ссылка на локальный объект, который к моменту использования оказывается уничтоженным.
Вот так очень понятно. Большое спасибо.
Yandex
Объявления
28.03.2012, 14:21     Почему перегруженный оператор = должен возвращать ссылку на объект
Ответ Создать тему
Опции темы

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