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

Оператор суммирования (классы, перегрузка операторов) - C++

Восстановить пароль Регистрация
 
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
27.05.2013, 21:21     Оператор суммирования (классы, перегрузка операторов) #1
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
29
30
#include <iostream>
 
class mat
{
public:
mat() { var = 0;  }
mat(int a) { var = a;  }
~mat() {  }
void set(int b) { var = b; }
int get() const { return var; }
 
mat plus (const mat & r)
{
return mat(var + r.get());
}
 
private:
int var;
};
 
int main()
{
mat one(2), two(3), three;
three = one.plus(two);
 
std::cout << "\nONE: " << one.get() << "\nTWO: " << two.get() << "\nTHREE: " << three.get() << "\n";
 
system("pause");
return 0;
}
Подскажите, переменная-член var = 2 объекта one, переменная-член var = 3 объекта two
Правильно ли я понимаю, что в строке 14 (var + r.get()) var относится к объекту one, потому что вызывается при помощи этого объекта (в частности one.plus(two) ), а r.get() уже имеет отношение к объекту two т.к. мы передавали этот объект (в частности one.plus(two) ), там он принимался и т.д.

Верно я все понимаю?

Добавлено через 1 минуту
И еще вопрос, что именно возвращает строка 14, просто 5 или mat(5) ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2013, 21:21     Оператор суммирования (классы, перегрузка операторов)
Посмотрите здесь:

классы и методы, перегрузка операторов == и !=? C++
классы, матрицы, перегрузка операторов,дружественные функции C++
Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами. C++
C++ C++: Классы, перегрузка операторов
C++ Классы. Перегрузка операторов для комплексного числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
27.05.2013, 21:22     Оператор суммирования (классы, перегрузка операторов) #2
Цитата Сообщение от VLK Посмотреть сообщение
Верно я все понимаю?
Да.

Вот только где здесь перегрузка операторов?
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
27.05.2013, 21:23  [ТС]     Оператор суммирования (классы, перегрузка операторов) #3
Цитата Сообщение от Why so seriouS Посмотреть сообщение
Да.

Вот только где здесь перегрузка операторов?
сейчас будет.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.05.2013, 21:25     Оператор суммирования (классы, перегрузка операторов) #4
Цитата Сообщение от VLK Посмотреть сообщение
И еще вопрос, что именно возвращает строка 14, просто 5 или mat(5) ?
mat(var + r.get()) вызывает конструктор mat(int a) { var = a; } и таким образом создает временный объект mat. Потом он передается по значению (копируется, но не забываем NRVO) и присваивается three.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
27.05.2013, 21:30  [ТС]     Оператор суммирования (классы, перегрузка операторов) #5
Второй вопрос но по той же тематике:

Кликните здесь для просмотра всего текста
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
29
30
#include <iostream>
 
class mat
{
public:
mat() { var = 0; }
mat(int a) { var = a; }
~mat() {  }
void set(int b) { var = b; }
int get() const { return var; }
 
mat operator+ (const mat & r)
{
return mat(var + r.get());
}
 
private:
int var;
};
 
int main()
{
mat one(2), two(3), three;
three = one + two;
 
std::cout << "\nONE: " << one.get() << "\nTWO: " << two.get() << "\nTHREE: " << three.get() << "\n";
 
system("pause");
return 0;
}


Правильно ли я понимаю, что в данном случае в строчке 24, + является оператором относящимся к классу mat, а точнее является функцией членом - operator+
и в данной строчке (24) этот плюс имеет отношение к объекту one а в качестве передаваемых параметров является объект two
т.е. в строчке 14 var имеет отношение к объекту one и равен 2, а r.get() уже имеет отношение к объекту two т.к. мы передавали этот объект, правильно я все понимаю?

Добавлено через 32 секунды
Цитата Сообщение от Olivеr Посмотреть сообщение
mat(var + r.get()) вызывает конструктор mat(int a) { var = a; } и таким образом создает временный объект mat. Потом он передается по значению (копируется, но не забываем NRVO) и присваивается three.
т.е. mat(5) ?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.05.2013, 21:32     Оператор суммирования (классы, перегрузка операторов) #6
Цитата Сообщение от VLK Посмотреть сообщение
Правильно ли я понимаю, что в данном случае в строчке 24, + является оператором относящимся к классу mat, а точнее является функцией членом - operator+
и в данной строчке (24) этот плюс имеет отношение к объекту one а в качестве передаваемых параметров является объект two
т.е. в строчке 14 var имеет отношение к объекту one и равен 2, а r.get() уже имеет отношение к объекту two т.к. мы передавали этот объект, правильно я все понимаю?
Да.
А чтобы возникло меньше таких вопросов в учебниках рекомендуют делать так (для понимания):
C++
1
2
3
4
5
mat operator+ (const mat & r)
{
cout << "mat::operator+";
return mat(var + r.get());
}
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
27.05.2013, 21:43  [ТС]     Оператор суммирования (классы, перегрузка операторов) #7
Цитата Сообщение от Olivеr Посмотреть сообщение
А чтобы возникло меньше таких вопросов в учебниках рекомендуют делать так (для понимания):
C++
1
2
3
4
5
mat operator+ (const mat & r)
{
cout << "mat::operator+";
return mat(var + r.get());
}

Не по теме:

Я сначала начал разбирать 2-й пример и очень долго не мог въехать что происходит в строке 24, потом вернулся на пример назад, разобрал его, и начал въезжать во 2-й пример, ну вот и решил убедится окончательно.

а насчет cout << "mat::operator+" была у меня такая строчка изначально, только что то она мне не помогла.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2015, 12:12     Оператор суммирования (классы, перегрузка операторов)
Еще ссылки по теме:

C++ Перегрузить оператор суммирования, не принадлежащий классу
C++ Перегрузка операторов, оператор присваивания
ООП классы, перегрузка операторов C++

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

Или воспользуйтесь поиском по форуму:
rvma
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 5
05.03.2015, 12:12     Оператор суммирования (классы, перегрузка операторов) #8
То что вызывается конструктор при, применении оператора +, то логично. И то что оператор вызывает функцию для перегрузки плюса тоже логично. Но в этих ответах нету никакой "философии", т.е. я не хочу сказать, что ответ не правильный, а скорее ответ не разъясняет саму суть. К примеру, с операторами пре и пост инкрементов и декрементов все воспринимается легко, т.к. эти операторы применяются к одному объекту и лигично, что фун-я перегрузки будет вызываться из того же объекта и по флагу передачи int определяется - будет применятся пре или пост инкр. декр. Вот, а теперь не ясно что делает оператор + в вызывающей функции, как он "знает" из какого объекта ему вызывать функцию перегрузки? Ведь программа начинает работу не из интерфейса, то логично. И не ясно откудого он "знает" какое значение присваивать, т.е. левое или правое. Хотелось бы въехать поглубже, понять откудого ноги растут, иначе как строить уже алгоритм, если не въехал в суть, а просто запомнил. Надеюсь я доступно задал свой вопрос. И надеюсь кто-то мне поможет с ответом)

Добавлено через 34 минуты
В дополнение к вопросу, могу сказать, что не разобравшись к какому из объектов применяется вызов функции перегрузки(ФП), и какой передается в качестве параметра, можно сделать вывод, что: 1)ФП вызывается для обоих объектов, и каждый суммируется друг с другом, значит, как-бы, результат в объекте three будет за двоен; 2)оператор + вызовет ФП для обоих объектов и они просуммируют сами себя, тут вообже непонятка))) Ошибка компиляции пересадки головного мозга, короче хрень.

Добавлено через 1 час 39 минут
Нашел в нете такой кусок. Наталкивает на некоторые мысли. Но я не уверен полностью. Таки как это работает?
C++
1
2
3
4
const Integer operator+(const Integer& left, const Integer& right) 
{
    return Integer(left.value + right.value);
}
Yandex
Объявления
05.03.2015, 12:12     Оператор суммирования (классы, перегрузка операторов)
Ответ Создать тему
Опции темы

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