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

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2013, 21:21
Ответы с готовыми решениями:

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

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

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

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

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

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

Вот только где здесь перегрузка операторов?
сейчас будет.
0
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
27.05.2013, 21:25 4
Цитата Сообщение от VLK Посмотреть сообщение
И еще вопрос, что именно возвращает строка 14, просто 5 или mat(5) ?
mat(var + r.get()) вызывает конструктор mat(int a) { var = a; } и таким образом создает временный объект mat. Потом он передается по значению (копируется, но не забываем NRVO) и присваивается three.
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
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) ?
0
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
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());
}
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
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+" была у меня такая строчка изначально, только что то она мне не помогла.

0
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);
}
0
05.03.2015, 12:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2015, 12:12
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru