IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Перегрузка операторов
ammaximus
сообщение 4.02.2009 21:56
Сообщение #1


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


#include <iostream.h>

class a {
double x;
public:
void operator++(){
this->x = x+9;
return;
};
friend a operator--(a &b){
b.x = b.x-9;
return b;
};
a operator+(a &c){
(this->x)+=(c.x);
return *this;

};
friend a operator-(a &b, a &c){
a temp;
temp.x=(b.x)-(c.x);
return temp;
};

print(){
cout<<x;
cout<<endl;
};

a(){
x=1;
};
};

int main() {
a kot;
kot.print();
++kot;
cout << endl;
kot.print();
--kot;
kot.print();
a rot, mot;
++rot;
mot = kot+rot;
mot.print();


return 1;
}

Просто перегрузка операторов. При этом минусы - друзья, плюсы - функции члены. Я делаю функции встраиваемыми просто для удобства.

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

Да, вот еще, как реализуется постфиксная запись? Можно ли делать кардинально разные реализации для разных типов вызова операторов?


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 4.02.2009 22:32
Сообщение #2


Гость






Цитата
функция Принт вызывает warning
На более жестком компиляторе это предупреждение тут же становится ошибкой: нельзя описывать функцию без типа возвращаемого значения. Ничего не возвращает - значит void...

Цитата
Да, вот еще, как реализуется постфиксная запись?
Ты имеешь в виду, как реализуется постфиксный инкремент/декремент? Очень просто, в префиксном нет параметров, а в постфиксном в качестве параметра передается int (просто, чтобы отличить одно от другого, так принято делать), то есть, если префиксный был:
void operator++();
// то постфиксный -
void operator ++(int);
// или
friend a operator++(a &b, int);


А вот теперь - касательно ответа на вопрос:
Цитата
Насколько эффективна программа, нет ли каких других неточностей?
А как, прости, ты будешь различать префикс и постфикс, если префиксный вариант ++ у тебя ничего не возвращает? Весь смысл-то и есть в различии, что префикс возвращает измененное значение, а постфикс - НЕизмененное. Сделай вот так, например:
#include <iostream.h>
class a {
friend ostream& operator << (ostream& os, a& obj) {
os << obj.x;
return os;
}

private:
double x;
public:
a& operator++() {
this->x += 9;
return *this;
}
a& operator++(int) {
a& copy = *this;
this->x += 9;
return copy;
}

friend a operator--(a &b) {
b.x = b.x-9;
return b;
}
a operator + (a &c) {
(this->x)+=(c.x);
return *this;
}
friend a operator-(a &b, a &c){
a temp;
temp.x=(b.x)-(c.x);
return temp;
}
void print() {
cout<<x<<endl;
}

a() {
x = 1;
}
};

int main() {
a kot;
// kot.print();
cout << ++kot << endl;
cout << kot << endl;
cout << kot++ << endl;
cout << kot << endl;

// kot.print();
--kot;
kot.print();
a rot, mot;
++rot;
mot = kot+rot;
mot.print();
return 0; // no errors
}
, и поиграйся с этой реализацией, посмотри, на что она способна...
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 26.07.2025 16:41
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"