С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236

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

27.05.2013, 21:21. Показов 2130. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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) ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2013, 21:21
Ответы с готовыми решениями:

Классы: перегрузка операторов
Добрый день. Есть задание - Определить класс «матрица». Определить операции над матрицами : ++ определение суммы матрицы +...

Классы и методы, перегрузка операторов == и !=
не могу разобраться с перегрузкой операторов == или != для 2 массивов типа char и int состоящих из 5 элементов. при составлении кода...

Перегрузка операторов, оператор присваивания
Перегрузка операторов, запутано-намутано #include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &lt;iostream&gt; using namespace::std; ...

7
 Аватар для Why so seriouS
45 / 45 / 12
Регистрация: 12.03.2013
Сообщений: 167
27.05.2013, 21:22
Цитата Сообщение от VLK Посмотреть сообщение
Верно я все понимаю?
Да.

Вот только где здесь перегрузка операторов?
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
27.05.2013, 21:23  [ТС]
Цитата Сообщение от Why so seriouS Посмотреть сообщение
Да.

Вот только где здесь перегрузка операторов?
сейчас будет.
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
27.05.2013, 21:25
Цитата Сообщение от VLK Посмотреть сообщение
И еще вопрос, что именно возвращает строка 14, просто 5 или mat(5) ?
mat(var + r.get()) вызывает конструктор mat(int a) { var = a; } и таким образом создает временный объект mat. Потом он передается по значению (копируется, но не забываем NRVO) и присваивается three.
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
27.05.2013, 21:30  [ТС]
Второй вопрос но по той же тематике:

Кликните здесь для просмотра всего текста
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) ?
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
27.05.2013, 21:32
Цитата Сообщение от 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());
}
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
27.05.2013, 21:43  [ТС]
Цитата Сообщение от 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+" была у меня такая строчка изначально, только что то она мне не помогла.

0
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 5
05.03.2015, 12:12
То что вызывается конструктор при, применении оператора +, то логично. И то что оператор вызывает функцию для перегрузки плюса тоже логично. Но в этих ответах нету никакой "философии", т.е. я не хочу сказать, что ответ не правильный, а скорее ответ не разъясняет саму суть. К примеру, с операторами пре и пост инкрементов и декрементов все воспринимается легко, т.к. эти операторы применяются к одному объекту и лигично, что фун-я перегрузки будет вызываться из того же объекта и по флагу передачи 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);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2015, 12:12
Помогаю со студенческими работами здесь

Классы, матрицы, перегрузка операторов, дружественные функции
Гляньте пожалуйста, как получилось сделать задание, что неверно: Создать класс, в котором перегрузить операторы: &amp; для...

Классы. Перегрузка операторов для комплексного числа
На основе вот этой темы: https://www.cyberforum.ru/cpp-beginners/thread1010206.html (к сожалению более вразумительного примера я не...

Нужен код, в котором есть: Классы, Наследование, Виртуальная функция, Перегрузка операторов
Скоро сдавать лабораторные работы, помогите пожалуйста)) Если можете, пришлите код, в котором есть: Классы, Наследование, Виртуальная...

Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами.
Задание: Сделать так чтобы оператор &gt;&gt; находил разницу между датами. Программа рабочая. Написана на С++ Возникли проблемы с...

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru