1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
На более жестком компиляторе это предупреждение тут же становится ошибкой: нельзя описывать функцию без типа возвращаемого значения. Ничего не возвращает - значит 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; }
нельзя описывать функцию без типа возвращаемого значения.
Вот это я баран... Ошибка из цикла "бабушка и очки"...
Не работает..
a operator++(int) { a copy = *this; this->x += 9; return copy;
По моему, темповская переменная должна быть объектом, а не ссылкой. Но как вернуть ссылку на нее?
a& operator++(int) { a copy = *this; this->x += 9; return & copy; //берем адрес copy
Так че-то не работает.
При возврате функции создается еще одна копия copy, вызывается конструктор и этой копии присваивается значение copy. Я верно мыслю? Так как избежать этого?
a& operator++(int) {//оператор возвращает ссылку на тип а a& copy = *this; //тут создается ссылочная переменная указывающая на this this->x += 9; // тут мы меняем this объект return copy; // тут мы возвращаем ссылку на this
Где ошибка?
MS так все и делает. А что тогда делает ГНУ? Компиляторы разные, но язык один.
a& operator++(int) {//оператор возвращает ссылку на тип а a copy = *this; this->x += 9; return & copy; // берем адрес copy и возвращаем его, поскольку он // содержит то самое значение которое было ДО
Ты действительно не видишь разницы между ССЫЛКОЙ и АДРЕСОМ? По какому праву ты хочешь вернуть из метода АДРЕС, когда в заголовке написано, что метод должен возвращать ССЫЛКУ?
Цитата
Где ошибка?
У тебя что, там ошибка? Ни Intel C++, ни GNU, ни Cameau ошибок не видят... По-моему ты сам себя запутал... Если у тебя что-то не компилируется, или не работает - показывай, в какой строке, и что именно происходит... Я компиляторами от MS не пользуюсь, проверить, что там делает MSVC не могу...
Ты действительно не видишь разницы между ССЫЛКОЙ и АДРЕСОМ? По какому праву ты хочешь вернуть из метода АДРЕС, когда в заголовке написано, что метод должен возвращать ССЫЛКУ?
Хм...Логично. Честно говоря я постоянно путаю куда поставить амперсанд... Не суди строго, я учу это вторую неделю. И С я до этого тоже знал в общих чертах(ни черта не знал).
Не ошибка просто участок
cout << ++kot << endl; cout << kot << endl; cout << kot++ << endl; cout << kot << endl;
выводит 10 10 19 19 Хотя должен (я думаю, что должен) 10 10 10 19 Поэтому я начал мудрить. Фраза "Не работает.." не относится к коду под ним, забыл поставить прогал.
Это как раз работает, причем так как я предполагаю, но создает лишнюю копию:
a operator++(int) { a copy = *this; this->x += 9; return copy;
a operator++(int) { a copy(*this); this->x += 9; return copy; }
a() { x = 1; } }; int main() { a kot; cout << ++kot << endl; cout << kot << endl; cout << kot++ << endl; cout << kot << endl;
return 0; }
(это каноническая форма перегрузки пре/пост-фиксного инкремента, взято из книги "C++ Coding Standards" Саттера и Александреску)...
Если при перегрузке операции вывода убрать const, программа тут же перестанет компилироваться... Что теперь выводится?
Кстати, цитата оттуда:
Цитата
In calling code, prefer using the prefix form unless you actually need the original value returned by the postfix version. The prefix form is semantically equivalent, just as much typing, and often slightly more efficient by creating one less object. This is not premature optimization; it is avoiding premature pessimization