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

Перегрузка оператора - возвращаемый тип - C++

Восстановить пароль Регистрация
 
Гоблин
 Аватар для Гоблин
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 29
08.12.2011, 10:20     Перегрузка оператора - возвращаемый тип #1
C++
1
2
3
4
5
6
7
8
9
10
11
class A {
  private:
    int x;
  public:
    A& operator += (int y);
};
  
  A& A::operator += (int y) {
    x = y;
    return *this;
  }
Зачем в данном примере указывать возвращаемый тип A& и возвращать *this, если меняется только переменная внутри класса и никакого значения не возвращается? Есть мнение что при перегрузке оператора так нужно делать всегда. Зачем?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2011, 10:20     Перегрузка оператора - возвращаемый тип
Посмотрите здесь:

C++ Перегрузка оператора <<
C++ Функции, возвращаемый тип
C++ Возвращаемый тип шаблона через std::common_type
C++ перегрузка оператора []
В наследнике(-ах) требуется изменить возвращаемый тип этих функций. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
08.12.2011, 11:50     Перегрузка оператора - возвращаемый тип #2
Это делается, что б иметь возможность писать такое:
C++
1
2
A a, b;
a+=b+=10;
т.е. последовательность из нескольких операторов.
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
08.12.2011, 12:01     Перегрузка оператора - возвращаемый тип #3
Возвращаемый тип А& означает что вы вернёте адрес переменной типа А (вашего класса ) а *this это и есть ваш объект (переменная типа) тогда использование перегруженного оперетора но его место встанет тот что вы вернёте из функции перегрузки
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
08.12.2011, 13:10     Перегрузка оператора - возвращаемый тип #4
Цитата Сообщение от A555 Посмотреть сообщение
Возвращаемый тип А& означает что вы вернёте адрес переменной типа А
учите матчасть, молодой человек! Это ссылка, а не адрес.
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
08.12.2011, 18:45     Перегрузка оператора - возвращаемый тип #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
учите матчасть, молодой человек! Это ссылка, а не адрес.
каюсь)
Гоблин
 Аватар для Гоблин
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 29
09.12.2011, 16:49  [ТС]     Перегрузка оператора - возвращаемый тип #6
Заголовочный файл MyClass.h
C++
1
2
3
4
5
6
7
8
9
class MyClass {
  private:
    int x;
  public:
    MyClass();
    int GetX();
    MyClass& operator += (int y);
    MyClass& operator += (MyClass &mc);
} ;
Функции класса (MyClass.cpp)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "MyClass.h"
 
MyClass::MyClass() {
  x = 0;
}
 
int MyClass::GetX() {
  return x;
}
 
MyClass& MyClass::operator += (int y) {
  x = x + y;
  return *this;
}
 
MyClass& MyClass::operator += (MyClass &mc) {
  x = x + mc.GetX();
}
Сам юнит
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <conio.h>
#include <stdio.h>
#include "MyClass.h"
 
void main() {
  MyClass MC, MC1, MC2;
  MC += 0;
  MC1 += 1;
  MC2 += 2;
  MC += MC1 += MC2; // эта строчка не работает. почему?
  MC += MC1 += 10; // а вот эта работает. опять же почему?)
  printf("%d",MC.GetX());
  getch();
}
Спасибо. Но почему не работает конструкция MC += MC1 += MC2? Что происходит в памяти при MC += MC1 += 10? То есть почему если сделать void operator += (int y); работать отказывается? Насколько я понимаю, сначала изменится х в классе MC1, а потом уже будет работаь MC.x + MC1.x, то есть там просто не надо возвращать ссылку. Или я не прав?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2011, 17:07     Перегрузка оператора - возвращаемый тип
Еще ссылки по теме:

C++ Перегруженные функции. Возвращаемый тип
Перегрузка оператора C++
C++ Возвращаемый тип конструктора копирования в абстрактном классе

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.12.2011, 17:07     Перегрузка оператора - возвращаемый тип #7
Цитата Сообщение от Гоблин Посмотреть сообщение
Зачем в данном примере указывать возвращаемый тип A& и возвращать *this, если меняется только переменная внутри класса и никакого значения не возвращается? Есть мнение что при перегрузке оператора так нужно делать всегда. Зачем?
C++
1
2
3
4
5
6
7
8
9
10
11
A a, b;
...
a=b+=2;//За одну строку увеличиваем b на 2 и результат копирожаем в a
if (b+=4)
{
 //А эти скобки отработают в том случае, если в результате инкремента b не получило значения, которое при приведении к bool даёт false
}
b+=4; // Эта и
if (b) // эта строки вместе эквивалентны строке if (b+=4)
{
}
Добавлено через 4 минуты
Цитата Сообщение от Гоблин Посмотреть сообщение
MC += MC1 += MC2?
а как объявлен
C++
1
operator += (MyClass &x);
?

Добавлено через 3 минуты
Цитата Сообщение от Гоблин Посмотреть сообщение
то есть там просто не надо возвращать ссылку.
Плюсы не комбинаторны, каждый оператор и каждая декларация имеет самостоятельное значение, а не так, что если правый операнд - скаляр, то ссылка нужна, а если объект, то нет, а если вообще double, то умножение вообще в другом месте становится степенью.
Yandex
Объявления
09.12.2011, 17:07     Перегрузка оператора - возвращаемый тип
Ответ Создать тему
Опции темы

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