Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1 / 1 / 1
Регистрация: 17.10.2010
Сообщений: 29
1

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

08.12.2011, 10:20. Показов 1511. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2011, 10:20
Ответы с готовыми решениями:

Непонятный возвращаемый тип
Расскажите какой тип должен быть у переменной idRe, чтобы можно было бы присвоить ему значение...

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

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

Перегруженные функции. Возвращаемый тип
Добро всем времени суток. Изучаю Р.Лаворе книгу и наткнулся на непонятныий мне аспект. Вот есть...

6
5203 / 3176 / 358
Регистрация: 12.12.2009
Сообщений: 8,034
Записей в блоге: 2
08.12.2011, 11:50 2
Это делается, что б иметь возможность писать такое:
C++
1
2
A a, b;
a+=b+=10;
т.е. последовательность из нескольких операторов.
0
51 / 51 / 4
Регистрация: 04.04.2011
Сообщений: 209
08.12.2011, 12:01 3
Возвращаемый тип А& означает что вы вернёте адрес переменной типа А (вашего класса ) а *this это и есть ваш объект (переменная типа) тогда использование перегруженного оперетора но его место встанет тот что вы вернёте из функции перегрузки
0
5203 / 3176 / 358
Регистрация: 12.12.2009
Сообщений: 8,034
Записей в блоге: 2
08.12.2011, 13:10 4
Цитата Сообщение от A555 Посмотреть сообщение
Возвращаемый тип А& означает что вы вернёте адрес переменной типа А
учите матчасть, молодой человек! Это ссылка, а не адрес.
0
51 / 51 / 4
Регистрация: 04.04.2011
Сообщений: 209
08.12.2011, 18:45 5
Цитата Сообщение от Kastaneda Посмотреть сообщение
учите матчасть, молодой человек! Это ссылка, а не адрес.
каюсь)
0
1 / 1 / 1
Регистрация: 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
4200 / 1792 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2011, 17:07

Возвращаемый тип как rvalue reference
Нашел интересный пример в книге Мейерса Эффективный и современный С++. class Widget { ...

Возвращаемый тип шаблона через std::common_type
Вот отрывок моего кода. Не могу понять как определить возвращаемый тип объекта matrix....

что за возвращаемый тип, и как работает функция?
pair&lt;string, string&gt; splitExpression(string expr) { stringstream ss; ss &lt;&lt; expr; pair&lt;string,...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru