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

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

Войти
Регистрация
Восстановить пароль
 
Гоблин
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 29
#1

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

08.12.2011, 10:20. Просмотров 788. Ответов 6
Метки нет (Все метки)

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, если меняется только переменная внутри класса и никакого значения не возвращается? Есть мнение что при перегрузке оператора так нужно делать всегда. Зачем?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2011, 10:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора - возвращаемый тип (C++):

Возвращаемый тип по умолчанию - C++
Приветствую всех! В книге Р. Лафоре "Объектно-ориентированное программирование в C++" прочитал следующее: Скажите, с чем связан...

Непонятный возвращаемый тип - C++
Расскажите какой тип должен быть у переменной idRe, чтобы можно было бы присвоить ему значение s.length , если s объект класса string?

Функции, возвращаемый тип - C++
Как сделать так, что бы функция возвращала разный тип данных, в зависимости от некой глобальной переменной? Например, если эта...

Перегруженные функции. Возвращаемый тип - C++
Добро всем времени суток. Изучаю Р.Лаворе книгу и наткнулся на непонятныий мне аспект. Вот есть код: String(char s) { ...

Возвращаемый тип конструктора копирования в абстрактном классе - C++
Здравствуйте! Есть абстрактный класс (с "чистыми" виртуальными функциями), и в нем необходимо явно определить конструктор копирования....

что за возвращаемый тип, и как работает функция? - C++
pair<string, string> splitExpression(string expr) { stringstream ss; ss << expr; pair<string, string> result; getline(ss,...

6
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 1
08.12.2011, 11:50 #2
Это делается, что б иметь возможность писать такое:
C++
1
2
A a, b;
a+=b+=10;
т.е. последовательность из нескольких операторов.
0
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
08.12.2011, 12:01 #3
Возвращаемый тип А& означает что вы вернёте адрес переменной типа А (вашего класса ) а *this это и есть ваш объект (переменная типа) тогда использование перегруженного оперетора но его место встанет тот что вы вернёте из функции перегрузки
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 1
08.12.2011, 13:10 #4
Цитата Сообщение от A555 Посмотреть сообщение
Возвращаемый тип А& означает что вы вернёте адрес переменной типа А
учите матчасть, молодой человек! Это ссылка, а не адрес.
0
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
08.12.2011, 18:45 #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
учите матчасть, молодой человек! Это ссылка, а не адрес.
каюсь)
0
Гоблин
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, то есть там просто не надо возвращать ссылку. Или я не прав?
0
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, то умножение вообще в другом месте становится степенью.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2011, 17:07
Привет! Вот еще темы с ответами:

Возвращаемый тип шаблона через std::common_type - C++
Вот отрывок моего кода. Не могу понять как определить возвращаемый тип объекта matrix. template&lt;typename V, typename U, size_t R, size_t...

В наследнике(-ах) требуется изменить возвращаемый тип этих функций. - C++
Есть базовый класс. Есть наследник базового класса. В базовом классе есть два виртуальных метода - Get(int id) и Set(int id). В...

Для чего нужен возвращаемый тип в перегрузке ввода >> и почему без него него выдаётся ошибка? - C++
Для чего нужен возвращаемый тип в перегрузке ввода &gt;&gt;, какую роль он выполняет что без него него выдаётся ошибка. cin объект istream...

перегрузка оператора + - C++
Не могу понять: в 184 строке отказывается работать. Без нее - все нормально. Скорее всего неправильно переопределил +.... Но если...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
09.12.2011, 17:07
Ответ Создать тему
Опции темы

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