Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка унарных операторов 
V
    Опции темы
Dibilkin
Дата 23.1.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 23.1.2009

Репутация: нет
Всего: нет



Всем трям. Решил на днях разобраться с C++. Засел за книгу Джесса Либерти, дошел до главы «Дополнительные возможности функций», и… вот я здесь smile Потому что «нии-и-ипонятна!». В конце главы есть упражнения, по которым я набросал кое-какой код. Потом просмотрел пройденную главу, «переточил» программу под написанное автором учебника, и не понял, что же я сделал smile Понимаю, что похоже больше на бред сумасшедшего, поэтому постараюсь пояснить свою проблему на примере.

Код
class SimpleCircle {
public:
    SimpleCircle();
    SimpleCircle(int radius);
    ~SimpleCircle() {};
    int GetRadius() const { return itsRadius; };
    void SetRadius(int r) { itsRadius = r; }
    const SimpleCircle & operator ++();
    const SimpleCircle operator ++(int);
private:
    int itsRadius;
};

SimpleCircle::SimpleCircle():
itsRadius(5)
{}

SimpleCircle::SimpleCircle(int r):
itsRadius(r)
{}

const SimpleCircle & SimpleCircle::operator ++()
{
    ++itsRadius;
    return *this;
}

const SimpleCircle SimpleCircle::operator ++(int)
{
    SimpleCircle temp(*this);
    ++itsRadius;
    return temp;
}

int main()
{
    return 0;
}


Думаю, код в комментраиях не нуждается, все просто и прозрачно. Но вот мне очень хочется узнать:

1. Строки 8, 22. Мы возвращаем ссылку на постоянный объект класса SimpleCircle? Если да, то почему в 25-ой строке мы возвращаем непосредственно объект?
2. Строка 30. Мы создаем временный объект класса SimpleCircle, передавая в конструктор текущий объект? Если да, то что с переданным объектом делает компилятор, ведь конструктор класса SimpleCircle не обучен принимать какие-то ни было значения?

Понимаю, что мои вопросы напомнинают «почемучку» детей дошкольного возраста, интересующихся, почему же небо, туды-его-растуды, голубое, но я был бы очень признателен, если бы кто-то нашел возможность уделить мне несколько минут своего свободного времени и помог бы пролить свет на эти восьмые, девятые и т.д. по списку чудеса света smile
PM MAIL   Вверх
pan2004
Дата 23.1.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 2
Всего: 9



Цитата(Dibilkin @  23.1.2009,  21:20 Найти цитируемый пост)
1. Строки 8, 22. Мы возвращаем ссылку на постоянный объект класса SimpleCircle? Если да, то почему в 25-ой строке мы возвращаем непосредственно объект?

В функции
Код

const SimpleCircle & SimpleCircle::operator ++()
{
    ++itsRadius;
    return *this;
}

мы возвращаем ссылку на *this, чтобы избежать(возможного, но лишнего) копирования. Мы можем это сделать, потому что время жизни объекта this не ограничено временем выполнения этой функции.члена класса.
Здесь же
Код

const SimpleCircle SimpleCircle::operator ++(int)
{
    SimpleCircle temp(*this);
    ++itsRadius;
    return temp;
}

мы не можем вернуть ссылку на temp, потому что эта переменная локальная в пределах данной функции, и по выходу она прекратит свое существование. Ссылка в таком случае указывала бы на уже не существующий объект.

Цитата(Dibilkin @  23.1.2009,  21:20 Найти цитируемый пост)
Если да, то что с переданным объектом делает компилятор, ведь конструктор класса SimpleCircle не обучен принимать какие-то ни было значения?

У класса всегда есть(явно или неявно) конструктор-копировщик, имеющий сигнатуру SimpleCircle(const SimpleCircle&). Так что все нормально, вызовется этот конструктор.

Вы могли заметить, что происходит слишком много операций копирования, фактически лишние. Современные компиляторы, однако, достаточно умны, чтобы оптимизировать подобные случаи. Так что в release версии, вполне возможно, копий и временных объектов создаваться не будет

Добавлено через 1 минуту и 50 секунд
Вообще, второй оператор не должен(не обязан) возвращать константный объект.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
Dibilkin
Дата 23.1.2009, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 23.1.2009

Репутация: нет
Всего: нет



pan2004, спасибо большое! Разобрался  smile Штудируем учебник дальше…
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.