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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
#1

operator - C++

24.01.2011, 22:20. Просмотров 1848. Ответов 36
Метки нет (Все метки)

Всем привет, опять непонятка в книге, дошел до оператора operator и ничего не понял, для чего он нужен, что он делает, то есть как он перегружает символы и как им пользоваться, привидите пожалуйста пример, заранее благодарен!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2011, 22:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос operator (C++):

Class & operator's |Error: undefined reference to operator - C++
Компилирует нормально, но когда хочу использовать оператор выдает ошибку:undefined reference to 'operator..(Fraction const&, Fraction...

Вызов operator[] через operator[] const - C++
Перелистывал Майерса, наткнулся на код, подскажите пожалуйста почему он советует закомментированный вариант кода, не проще сделать как...

operator char() или operator int() - C++
Здорова госпдо! Снова ничо не ясно как всегда. Разбираю программку из книги Страуструпа, там он описывает класс String в нем есть ...

Реализация operator + через operator += - C++
внутри следующей темы возник вопрос, ответ на который так и не был получен: ...

Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" - C++
Здравствуйте. Предлагаю заняться арифметикой. Создал прослейший класс, перегрузил операторы сложения и умножения, в конструкторе...

Operator +, operator += — какой через какой реализовывать? - C++
Для class Fraction { // ... public: Fraction operator + ( const Fraction& right ) const; Fraction& operator += ( const...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ISergey
Maniac
Эксперт С++
1374 / 885 / 52
Регистрация: 02.01.2009
Сообщений: 2,658
Записей в блоге: 1
24.01.2011, 22:33 #2
http://www.cplusplus.com/doc/tutorial/classes2/
0
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
24.01.2011, 22:39  [ТС] #3
у меня с англ проблема =(
0
asics
Freelance
Эксперт С++
2847 / 1784 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
24.01.2011, 22:46 #4
Цитата Сообщение от BTR Посмотреть сообщение
у меня с англ проблема =(
http://translate.google.com.ua/#
0
Escapable
54 / 54 / 1
Регистрация: 09.11.2010
Сообщений: 120
24.01.2011, 23:08 #5
BTR, operator служит для перегрузки операторов (+, -, ++, -- и т.д).
Пример:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
using namespace std;
 
class A
{
    int x, y, z;
public:
    A() { x = y = z = 0; }
    A(int i, int j, int k) { x = i; y = j; z = k; }
 
    A operator+(A op);  
    A operator-(A op);
 
    void show();
};
 
A A::operator+(A op)
{
    ThreeD temp;
    
    temp.x = x + op.x;
    temp.y = y + op.y;
    temp.z = z + op.z;
 
    return temp; 
}
 
A A::operator-(A op)
{
    A temp;
    
    temp.x = x - op.x;
    temp.y = y - op.y;
    temp.z = z - op.z;
 
    return temp;
}
 
void A::show()
{
    cout << x << ", ";
    cout << y << ", ";
    cout << z << endl;
}
 
int main()
{
    A a(1, 2, 3), b(10, 10, 10), c;
    с = a + b; // здесь выполняется перегрузка
    c.show();
    
    с = a - b; // и здесь тоже
    c.show();
    
return 0;
}
Т.е. если бы мы не перегрузили операторы + и -, то мы бы не смогли сложить\отнять объекты a и b.

Сам сейчас изучаю данную тему, как по мне, довольно специфическую.
1
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.01.2011, 09:28 #6
Главное - понять, что перегрузка операторов ничем не отличается от написания обычных функций. Вы сам пишете алгоритм, по которому будет выполняться тот или иной оператор (можно, например, оператор + перегрузить так, чтобы он умножал и т.д. - всё в ваших руках). Вы даже можете явно выполнить оператор как вызов функции (например, с = a.operator+(b); - именно такую конструкцию воспринимает компилятор, когда видит запись c = a + b. По себе знаю, пока считаешь перегрузку операций чем-то незаурядным, сверхъестественным - сложнее всё это понимать, чем когда до тебя доходит, что это тот же процесс написания функций.
0
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
27.01.2011, 18:01  [ТС] #7
все равно не пойму, как им пользоваться?

Добавлено через 19 секунд
можете привести более легкий пример?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.01.2011, 19:49 #8
Вот мини-примерчик:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
 
class A
{
public:
    A(int = 0);
    
    friend A operator+(const A &, const A &);
    friend A operator-(const A &, const A &);
    friend A operator*(const A &, const A &);
    friend A operator/(const A &, const A &);
 
    friend std::istream &operator>>(std::istream &, A &);
    friend std::ostream &operator<<(std::ostream &, const A &);
 
private:
    int _a;
};
 
A::A(int a):
_a(a)
{
}
 
A operator+(const A &lhs, const A &rhs)
{
    return A (lhs._a + rhs._a);
}
 
A operator-(const A &lhs, const A &rhs)
{
    return A (lhs._a - rhs._a);
}
 
A operator*(const A &lhs, const A &rhs)
{
    return A (lhs._a * rhs._a);
}
 
A operator/(const A &lhs, const A &rhs)
{
    return A (lhs._a / rhs._a);
}
 
std::istream &operator>>(std::istream &input, A &rhs)
{
    return input >> rhs._a;
}
 
std::ostream &operator<<(std::ostream &output, const A &rhs)
{
    return output << rhs._a;
}
 
int main()
{
    A a1, a2;
 
    std::cin >> a1 >> a2;
 
    std::cout << a1 + a2 << std::endl;
    std::cout << a1 - a2 << std::endl;
    std::cout << a1 * a2 << std::endl;
    std::cout << a1 / a2 << std::endl;
    std::cout << std::endl;
    std::cout << operator+(a1, a2) << std::endl;
    std::cout << operator-(a1, a2) << std::endl;
    std::cout << operator*(a1, a2) << std::endl;
    std::cout << operator/(a1, a2) << std::endl;
 
    return 0;
}
Как видите, я наглядно показал, что написание перегруженной версии оператора ничем не отличается от написания функции. Всё чисто логически. Если мы складываем два объекта типа A, то результат должен также иметь тип A - значит, тип возвращаемого значения будет A. Имя нашей функции (например, для сложения) - operator+. Т.е. мы можем явно вызвать эту функцию стандартно, написав имя и передаваемые параметры (operator+(a1, a2)), а можем неявно (тогда вызов функции подставит за нас компилятор) - просто написав a1 + a2. А реализация самой функции тоже чисто логически (это я всё к тому, что нет жёстких правил, тело вы можете написать какое угодно, а похожесть перегрузок возникает не из-за того, что всем талдычат некий шаблон, от которого нельзя отступать, а потому, что такой шаблон сам появляется, и он практически идеален, чтобы от него отступать) - результатом должен быть объект типа A. При этом на неком уровне абстракции он должен представлять сумму двух объектов типа A. В нашем случае всё интуитивно, объект - обёртка для целого числа, значит результатом сложения двух таких объектов должен быть объект, в котором хранится сумма этих чисел, что мы и делаем, создавая объект и инициализируя его значением rhs._a + lhs._a, а затем возвращая его в качестве результата сложения.
1
ForEveR
27.01.2011, 20:35
  #9

Не по теме:

silent_1991, А зачем френдами то?? Не, тоже вариант конечно, но имхо предпочтительнее через глобалы... Все же это вспомогательные функции.

0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
27.01.2011, 20:37 #10
ForEveR, наверное, чтобы иметь доступ к скрытым переменным.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.01.2011, 20:39 #11

Не по теме:

ForEveR, а как не друзьям обращаться к приватным членам? Не через геты же)))



Добавлено через 44 секунды

Не по теме:

volovzi, ога, опередили)))

0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.01.2011, 23:55 #12

Не по теме:

silent_1991, А почему не через геты собственно? По-моему это правильнее. Инкапсуляция все же.



Добавлено через 27 минут

Не по теме:

Хотя впринципе что-то я перебарщиваю) не суть как это писать)

0
silent_1991
28.01.2011, 05:59
  #13

Не по теме:

ForEveR, ну не знаю... Я вообще раньше мемберами делал, потом переключился на френды, удобнее работать, когда у тебя есть переменные left и right, а не *this и right . В примере с числами ещё ничего, а вот когда длинная арифметика или матрицы умножаешь - путаешься, у какой матрицы взять размер, а у какой очередной элемент)))

0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 06:07 #14
Цитата Сообщение от ForEveR Посмотреть сообщение
предпочтительнее через глобалы
Через глобалы нельзя, френдами не надо, а надо через члены.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.01.2011, 06:10 #15
Цитата Сообщение от taras atavin Посмотреть сообщение
френдами не надо
Это ещё почему? А передачу/извлечение из потока вы как членами сделаете? Да и кучу других операторов, где первый операнд может оказаться не объектом данного класса? Я всё-таки предпочитаю френды, уже написал, почему.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2011, 06:10
Привет! Вот еще темы с ответами:

Чем "operator *=" отличается от "operator *"? - C++
снова застряла, не могу понять, чем этот оператор должен отличаться от оператора*.....? вот он, но это работает только в случае...

Expected init-declarator before "operator".expected `,' or `;' before "operator" - C++
Пример не мой. Пытаюсь у себя запустить и чтото неполучается. Ошибка на строке 24 Expected init-declarator before &quot;operator&quot;.Expected...

Operator*=(); - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace::std; class Distance //Класс английских длин { ...

Operator + - C++
Создайте в классе Circle оператор + для сложения объектов типа Circle. Необходимо складывать только величины радиусов itsRadius. ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.01.2011, 06:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru