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

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

Войти
Регистрация
Восстановить пароль
 
Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
#1

Перегрузка операторов - C++

10.11.2012, 17:05. Просмотров 838. Ответов 11
Метки нет (Все метки)

Помогите разобраться в перегрузке операторов. Нужно создать клас Автомобиль в котором определить поля скорость и стоимость и методы доступа к этим полям. Перегрузить оператор "+" и "-", которые будут увеличивать или уменьшать цену автомобиля. Перегрузить оператор присвоения. Не могу понять как работает перегрузка операторов и зачем она нужна. Вот класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
class Avto
{
    int Speed, Cost;
public:
    mSpeed(int aSpeed) {Speed=aSpeed;}
    mCost(int aCost) {Cost=aCost;}
    Avto operator +(Avto obj);
    Avto operator -(Avto obj);
};
Не знаю что делать дальше, подскажите.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2012, 17:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка операторов (C++):

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

[c++] Перегрузка операторов - C++
Не работает. #include &lt;conio.h&gt; #include &lt;iostream.h&gt; #pragma argsused struct FazzyNumber { double x; double x1,x2; ...

Перегрузка операторов - C++
Помогите решить задачу на c++ мучаюсь 3 день Перегрузить операторы «==» и «!=» для строк. Оператор «==» возвращает соответственно 1,...

Перегрузка операторов - C++
Доброй ночи! Изучаю перегрузку операторов. Создал класс Дробь, где в качестве данных выступают числитель и знаменатель дроби. ...

Перегрузка операторов - C++
Осуществите перегрузку оператора “+=” так, чтобы при его использовании сумма увеличивалась на 5. Помогите, срочно.

Перегрузка операторов - C++
Пытаюсь написать такой код: char* operator+(char *s1, char *s2) { return &quot;&quot;; } выдаёт ошибку: http://codepad.org/KS8qU8Ml...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
10.11.2012, 17:24 #2
Перегрузка состоит из: компилятор идет по коду (с начала в main), увидел выражение, например, тот же "+" (вернее, с тем же "плюсом"). Смотрит, знает ли он типы, над которыми совершается операция (стандартные типа int, float и т.д.). Если, как в данном случае типы ему неизвестны (мы складываем объект с объектом), он ищет перегруженную функцию этого оператора (ее мы реализуем отдельно), а после уже выполняет тот участок кода, который содержится в той самой функции.
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
#include <iostream>
using namespace std;
 
class Avto
{
    int Speed, Cost;
public:
   
    Avto(int);
    Avto operator +(Avto obj);
    Avto operator -(Avto obj);
    Avto operator =(Avto obj);
    void print();
};
 
Avto::Avto(int c)
{
     Speed=0;
     Cost=c;
}
 
Avto Avto::operator + (Avto obj)
{
     return Avto(this->Cost+obj.Cost);
} 
 
Avto Avto::operator = (Avto obj)
{
     return Avto(this->Cost=obj.Cost);
} 
     
void Avto::print()
{
     cout<<Cost<<endl;
}  
int main()
{
 Avto carCost=400,carCost1=200,carCost2=300;
 carCost2=carCost+carCost1;
 carCost2.print();
 system("pause");
 return 0;
}
1
Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
10.11.2012, 17:53  [ТС] #3
BumerangSP, спасибо, буду разбираться. Правда компилятор ругается на system("pause");
0
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
10.11.2012, 18:17 #4
Leew,
C++
1
#include <windows.h>
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
10.11.2012, 18:20 #5
BumerangSP, <cstdlib> думаю лучше.
1
Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
10.11.2012, 18:46  [ТС] #6
BumerangSP, пишет "sh: pause: command not found". И еще одно. А как теперь перегрузить операторы "++", "--" что б они увеличивали или уменьшали скорость на 1. И операторы "+=", "-=" чтоб они отнимали и добавляли пробег. Там теперь ненужен объект как параметр?
0
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
10.11.2012, 19:20 #7
Toshkarik, мда, точно. Просто для этой команды ни разу не подключал библиотек
Хотя, я думал, что cstdlib итак должен подключаться. Видимо, не везде.

Добавлено через 6 минут
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
#include <iostream>
using namespace std;
 
class Avto
{
    int Speed, Cost;
public:
   
    Avto(int);
    Avto operator ++(int);
    void print();
};
 
Avto::Avto(int c)
{
     Speed=0;
     Cost=c;
}
 
Avto Avto::operator ++ (int)
{
     return Avto(this->Cost++);
} 
     
void Avto::print()
{
     cout<<Cost<<endl;
}  
int main()
{
 Avto carCost=0;
 carCost++;
 carCost++;
 carCost++;
 carCost.print();
 return 0;
}
Тут ++ перегружен. Для -- аналогично, только в функции перегрузки поменять ++ на --
C++
1
2
3
4
Avto Avto::operator -- (int)
{
     return Avto(this->Cost--);
}
Это перегрузка постфиксного инкремента и декремента. Для префиксного нужно будет убрать из списка аргументов int.

C++
1
2
3
4
Avto Avto::operator ++ ()
{
     return Avto(this->Cost++);
}
C++
1
++carCost;
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
10.11.2012, 20:12 #8
Цитата Сообщение от BumerangSP Посмотреть сообщение
Хотя, я думал, что cstdlib итак должен подключаться. Видимо, не везде.
Как же он должен подключиться, если его не подключать явно. Он может быть включен в некоторые другие стандартные заголовки, например, в iostream. Но это всего лишь реализация конкретного компилятора. Полагаться на нее не стоит, нужно явно включать необходимые заголовки.
0
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
10.11.2012, 21:01 #9
Toshkarik, да, вот у меня как раз он был включен. Поэтому и не вспомнил)
0
Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
11.11.2012, 14:12  [ТС] #10
Каким образом нужно перегрузить оператор "[]", чтобы можно было получать и изменять значение соответствующего элемента массива. Вот клас, только вод с перегрузкой не могу разобратся, как это реализовать.

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
#include <iostream>
using namespace std;
 
class Masyv
{
    int mas[4];
    int i;
public:
    void GetValue();
    void Show();
    Masyv operator [](int);
};
 
void Masyv::GetValue()
{
    for(int i=1;i<4;i++)
    {
    cout<<"Введите "<<i<<"-й элемент: "<<endl;
    cin>>mas[i];
    }
}
 
void Masyv::Show()
{
    for(int i=1;i<4;i++)
    {
    cout<<i<<"-й элемент: "<<mas[i]<<endl;
    }
}
 
Masyv Masyv::operator [](int)
{
 
}
 
int main()
{
    Masyv obj;
    obj.GetValue();
    obj.Show();
}
0
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
11.11.2012, 17:53 #11
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
#include <iostream>
using namespace std;
 
class Masyv
{
    int mas[4];
  //  int i;
public:
    Masyv();      
    void GetValue();
    void Show();
    int& operator [](const int);
};
 
Masyv::Masyv()
{
    mas[4]={0};           
 
}
 
void Masyv::GetValue()
{
    for(int i=1;i<4;i++)
    {
    cout<<"Введите "<<i<<"-й элемент: "<<endl;
    cin>>mas[i];
    }
}
 
void Masyv::Show()
{
    for(int i=1;i<4;i++)
    {
    cout<<i<<"-й элемент: "<<mas[i]<<endl;
    }
}
 
int& Masyv::operator [](const int i)
{
  return this->mas[i];
}
 
int main()
{
    Masyv obj;
    obj.GetValue();
    obj[3]=33;
    obj.Show();
}
1
Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
11.11.2012, 20:18  [ТС] #12
BumerangSP, большое спасибо за помощь.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2012, 20:18
Привет! Вот еще темы с ответами:

Перегрузка операторов - C++
Всем привет. Предположим, что нужно перегрузить оператор вывода &lt;&lt; для какого-то класса, определенного мной. Этот оператор должен выводить...

Перегрузка операторов - C++
Помогите, пожалуйста, решить задачу При создании собственных типов данных с помощью классов наиболее общей операцией является проверка...

Перегрузка операторов - C++
Объясните, пожалуйста, что означает, эта строка? return a != t1.a &amp;&amp; b != t1.b ? 1 : 0; что означает ? 1 : 0; ? Заранее...

Перегрузка операторов - C++
Нужно для класса комплексных чисел перегрузить операторы. Односимвольные определить как дружественные, а двусимвольные, присваивание и...


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

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

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