Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
1

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

28.03.2012, 01:30. Показов 2697. Ответов 9
Метки нет (Все метки)

Объясните доступно пожалуйста.

Почему перегруженный оператор= должен возвращать ссылку на объект? А оператор+ может возвращать как ссылку на объект, так и сам объект?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.03.2012, 01:30
Ответы с готовыми решениями:

Что должен возвращать оператор присваивания
Зачем оператору присваивания что-то возвращать? class B{ public: int a = 0; B&...

А можно в функцию, или перегруженный оператор передать ссылку на копию?
И какой надо написать прототип?

Почему не работает перегруженный оператор?
вот проект в котором реализуется простенький класс матрицы. посмотрите в чем проблема с...

Почему вызывается переопределённый метод Object.equals, хотя должен вызываться ПЕРЕГРУЖЕННЫЙ?
Суть: необходимо создать авторский класс, перегрузить в нём метод equals, создать объект этого...

9
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.03.2012, 02:56 2
Цитата Сообщение от Merovingian Посмотреть сообщение
Почему перегруженный оператор= должен возвращать ссылку на объект?
перегруженный оператор= ничего никому не должен, принято возвращать ссылку чтобы операция присваивания объектов пользовательского типа, имела такую же семантику как и у стандартных типов
1
Делаю внезапно и красиво
Эксперт С++
1311 / 1226 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
28.03.2012, 09:04 3
Цитата Сообщение от Merovingian Посмотреть сообщение
оператор+ может возвращать как ссылку на объект
Не может.
1
Эксперт С++
5042 / 3103 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
28.03.2012, 10:01 4
Deviaphan, ну почему же, могут быть очень экзотические случаи. Скажем, он возвращает ссылку на некоторый статический объект-член класса. Но это действительно экзотика, и ни о каком сохранении семантики речи уже не идёт
1
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
28.03.2012, 10:11 5
Цитата Сообщение от Merovingian Посмотреть сообщение
Почему перегруженный оператор= должен возвращать ссылку на объект?
потому что, если он не будет возвращать ссылку на объект, то компилятор будет запускать копиконструктор, и твоя операция будет называться не присваиванием, а инициализацией. А вот когда мы возвращаем ссылку на объект, тогда копиконструктор не запускается и получается операция присваивания.
0
Эксперт С++
5042 / 3103 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
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;
}
2
32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
28.03.2012, 10:32 7
Цитата Сообщение от silent_1991 Посмотреть сообщение
бред.
да, в голове все перемешивается, когда проходишь большие темы за день((
0
54 / 54 / 9
Регистрация: 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; // не работает
Но почему?
0
Делаю внезапно и красиво
Эксперт С++
1311 / 1226 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
28.03.2012, 14:16 9
Цитата Сообщение от Merovingian Посмотреть сообщение
Но почему?
Во-первых, потому что я уже предупредил, что не может (кроме исключительных случаев, упомянутых silent_1991)
Во-вторых, возвращается ссылка на локальный объект, который к моменту использования оказывается уничтоженным.
1
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
28.03.2012, 14:21  [ТС] 10
Цитата Сообщение от Deviaphan Посмотреть сообщение
Во-вторых, возвращается ссылка на локальный объект, который к моменту использования оказывается уничтоженным.
Вот так очень понятно. Большое спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.03.2012, 14:21

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку?
Сабж. Ну, то есть есть класс, что-то такое: #include &lt;iostream&gt; using namespace std; class...

Почему не работает условный оператор который по идее должен работать
Здравствуйте есть такой код . Суть в том что человек вводит команду Казино программа проверяет...

Почему оператор сложения двух временных объектов возвращает lvalue ссылку?
Допустим есть класс: class A { public: A() {} A(const A&amp;) { cout &lt;&lt; &quot;A(const A&amp;)\n&quot;; }...

Перегруженный оператор
MathClass = Harry; Раньше я думал, что перегрузка - это предоставление оператору функций,...

Перегруженный оператор +
Здравствуйте. Нужно разобраться как работает перегруз операторов. Я взял оператор + и пытаюсь...

Перегруженный оператор +
Товарищи программисты не могу понять вот этот кусок кода: dist4 = dist1 + dist2 + dist3; у нас...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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