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

Перегрузка бинарного оператора - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.92
FiXeR
7 / 7 / 1
Регистрация: 18.12.2009
Сообщений: 32
31.05.2010, 16:31     Перегрузка бинарного оператора #1
Хочу чтобы в моей программе знак "%" работал, как знак операция сложения действительных чисел "+". Где ошибка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cstdlib>
#include <iostream>
#include <conio.h>
using namespace std;
 
int operator %(int a,int b)
{   int c;
    c=a+b;             
    return c;
 }
 
int main()
{   int a,b,c;
a=1;
b=2;
    c=a%b;
    cout<<c<endl;
    getch();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
31.05.2010, 16:40     Перегрузка бинарного оператора #2
FiXeR, беда в том, что оператор %(int, int) и так существует. И перегрузить его не изменив передаваемые параметры не получится. Если так сильно хочется, можно свой класс создать, и в нём открытый статический метод такой сделать. Только вызываться это чудо как-то странно будет. Да и зачем Вам оно?..
FiXeR
7 / 7 / 1
Регистрация: 18.12.2009
Сообщений: 32
31.05.2010, 17:06  [ТС]     Перегрузка бинарного оператора #3
Мне надо понять как перегрузить оператор, вы предлагаете зделать методом, как это будет выглядеть, если можно покажите на коде.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
31.05.2010, 17:30     Перегрузка бинарного оператора #4
FiXeR, можно вот так например сделать:
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
31
#include <iostream>
 
class MyClass {
    int _val; // ну или нужный тип данных
public:
    MyClass() : _val(0) {}
    MyClass(int val) : _val(val) {}
    ~MyClass() {}
    int value() const { return _val; }
    void value(int val) { _val = val; }
};
 
MyClass operator% (const MyClass & a, const MyClass & b) {
    MyClass r(a.value() + b.value());
    return r;
}
 
std::ostream & operator << (std::ostream & ost, const MyClass & mc){
    ost << mc.value();
    return ost;
}
 
int main(){
    MyClass a(2), b(2), c;
 
    std::cout << "a = " << a << "; b = " << b << std::endl;
    c = a % b;
    std::cout << "a % b = " << c << std::endl;
 
    return 0;
}
Код
$ ./overload_percent 
a = 2; b = 2
a % b = 4
Serhiy_UA
0 / 0 / 0
Регистрация: 17.06.2012
Сообщений: 8
18.12.2012, 23:16     Перегрузка бинарного оператора #5
В предыдущем коде меня интересует 9-тая строка, а именно
C++
1
    int value() const { return _val; }
Почему здесь стоит служебное слово const ?
Я знаю, что без него программа работать не будет. Я хочу знать, согласно какого правила так надо писать. Тыкните меня носом, пожалуйста.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
18.12.2012, 23:23     Перегрузка бинарного оператора #6
Serhiy_UA, может так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
class ABC
{
private:
   const int val;
public:
   ABC(const int& val_)
      : val(val_)
   {
      
   }
   int operator%(const int& val2)
   {
      return val + val2;
   }
};
 
int main()
{
   std::cout << static_cast<ABC> (5) % 10 << std::endl;
}
http://liveworkspace.org/code/426jaY$0
Serhiy_UA
0 / 0 / 0
Регистрация: 17.06.2012
Сообщений: 8
19.12.2012, 00:03     Перегрузка бинарного оператора #7
go,
хочу обратить ваше внимание на код от easybudda.
Там есть метод
C++
1
2
3
MyClass operator% (const MyClass & a, const MyClass & b) {
    MyClass r(a.value() + b.value());
    return r;
Который не будет даже компилироваться(нельзя обратить к методу a.value()), если в описании метода value() нет слова "const".
Согласно какого правила там нужно ставить слово const?
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
19.12.2012, 00:12     Перегрузка бинарного оператора #8
Цитата Сообщение от Serhiy_UA Посмотреть сообщение
Который не будет даже компилироваться(нельзя обратить к методу a.value()), если в описании метода value() нет слова "const".
Согласно какого правила там нужно ставить слово const?
Слово const после круглых скобок в объявление(определение ) функции, означает, что эти функции не изменяют состояния класса.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
19.12.2012, 03:07     Перегрузка бинарного оператора #9
Цитата Сообщение от Serhiy_UA Посмотреть сообщение
В предыдущем коде меня интересует 9-тая строка, а именно
C++
1
    int value() const { return _val; }
Почему здесь стоит служебное слово const ?
Я знаю, что без него программа работать не будет. Я хочу знать, согласно какого правила так надо писать. Тыкните меня носом, пожалуйста.
Посмотрите, как передаются параметры в функции в 13 и 18 строке - как ссылки на константные объекты. Компилятор не проверяет, что на самом деле происходит внутри методов класса при вызове их из функции, но раз уж переданный по ссылке объект класса не должен изменяться, должна быть гарантия, что вызываемые внутри функции методы не изменят сам объект. Что, как уже верно заметили, и достигается объявлением метода, как константного. В качестве эксперимента попробуйте внутри константного метода как-нибудь изменить переменную, значение которой он возвращает. Оно, конечно, снова не скомпилируется (не должно бы по крайней мере), но прочитать сообщение об ошибке в этом случае тоже будет полезно...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 14:19     Перегрузка бинарного оператора
Еще ссылки по теме:

Перегрузка оператора = C++
Перегрузка бинарного оператора + C++
C++ Перегрузка оператора <<

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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
19.12.2012, 14:19     Перегрузка бинарного оператора #10
Цитата Сообщение от David Sylva Посмотреть сообщение
Слово const после круглых скобок в объявление(определение ) функции, означает, что эти функции не изменяют состояния класса.
Угу, только вот поля помеченные как mutable могут меняться. А вообще он написан для константных объектов. Уберите слово const и увидите error`ы.
Yandex
Объявления
19.12.2012, 14:19     Перегрузка бинарного оператора
Ответ Создать тему
Опции темы

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