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

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

Войти
Регистрация
Восстановить пароль
 
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
#1

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

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

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

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

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

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

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

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

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! - C++
Друзья! Обнаружил пробел в знаниях. Собсно, вопрос в теме. Дополню лишь: поля объекта меняются на нужные значения и безо всякого возврата...

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

9
Jupiter
Каратель
Эксперт С++
6560 / 3981 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.03.2012, 02:56 #2
Цитата Сообщение от Merovingian Посмотреть сообщение
Почему перегруженный оператор= должен возвращать ссылку на объект?
перегруженный оператор= ничего никому не должен, принято возвращать ссылку чтобы операция присваивания объектов пользовательского типа, имела такую же семантику как и у стандартных типов
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.03.2012, 09:04 #3
Цитата Сообщение от Merovingian Посмотреть сообщение
оператор+ может возвращать как ссылку на объект
Не может.
1
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.03.2012, 10:01 #4
Deviaphan, ну почему же, могут быть очень экзотические случаи. Скажем, он возвращает ссылку на некоторый статический объект-член класса. Но это действительно экзотика, и ни о каком сохранении семантики речи уже не идёт
1
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
28.03.2012, 10:11 #5
Цитата Сообщение от Merovingian Посмотреть сообщение
Почему перегруженный оператор= должен возвращать ссылку на объект?
потому что, если он не будет возвращать ссылку на объект, то компилятор будет запускать копиконструктор, и твоя операция будет называться не присваиванием, а инициализацией. А вот когда мы возвращаем ссылку на объект, тогда копиконструктор не запускается и получается операция присваивания.
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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;
}
2
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
28.03.2012, 10:32 #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
бред.
да, в голове все перемешивается, когда проходишь большие темы за день((
0
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; // не работает
Но почему?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.03.2012, 14:16 #9
Цитата Сообщение от Merovingian Посмотреть сообщение
Но почему?
Во-первых, потому что я уже предупредил, что не может (кроме исключительных случаев, упомянутых silent_1991)
Во-вторых, возвращается ссылка на локальный объект, который к моменту использования оказывается уничтоженным.
1
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
28.03.2012, 14:21  [ТС] #10
Цитата Сообщение от Deviaphan Посмотреть сообщение
Во-вторых, возвращается ссылка на локальный объект, который к моменту использования оказывается уничтоженным.
Вот так очень понятно. Большое спасибо.
0
28.03.2012, 14:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2012, 14:21
Привет! Вот еще темы с ответами:

перегруженный оператор << - C++
подскажите как перегрузить оператор &lt;&lt; для класса как описать само перегружение friend ostream&amp; operator &lt;&lt; (ostream &amp;c, const...

Перегруженный оператор вывода - C++
Пытаюсь написать шаблон для работы с бинарными деревьями поиска. Возникла проблема - с ходу не соображу что к чему. при попытке...

Функции и перегруженный оператор - C++
Помогите реализовать на С++: 1.Определить пользовательский тип данных fraction (дробь), представляющий собой структуру из 2х полей:...

Не работает перегруженный оператор - C++
Привет, у меня есть класс такой: class Sterling { private: long pounds = 0; int shillings = 0; int pennys = 0; public:...


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

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

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