Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2012, 16:48   #1
Qwoort
Пользователь
 
Аватар для Qwoort
 
Регистрация: 26.04.2009
Сообщений: 13
По умолчанию Несколько вопросов по классам

1. Зачем в следующем коде в объявлении стоит амперсанд?
2. Что значит RHS и когда его использовать?
3. Зачем стоит звездочка перед rhs.itsWeight?

Код:
CAT::CAT(const CAT & rhs)
{
   itsAge=new int;
   itsWeight=new int;
   *itsAge=rhs.GetAge();
   *itsWeight= *(rhs.itsWeight);
}


4.Почему в следующем коде в объявлении оператора преинкремента стоит амперсанд, а в объявлении оператора постинкремента - нет?

Код:
class Counter
{
   public:
      Counter();
      ~Counter(){}
      int GetItsVal() const {return itsVal;}
      void SetItsVal(int x) {itsVal = x;}
      const Counter& operator ++();  //Оператор преинкремента.
      const Counter operator ++(int);//Оператор постинкремента.
   private:                          
      int itsVal;                    
};


5. Почему в следующем коде в описаниях по два раза повторяется слово Counter?
6. Какую функцию здесь несет оператор THIS и зачем перед ним стоит звездочка?

Код:
const Counter& Counter::operator++()
{
   ++itsVal;
   return *this;
}

const Counter Counter::operator ++(int x)
{
   Counter temp(*this);
   ++itsVal;
   return temp;
}
Смех без причины - признак Даламбера.
Qwoort вне форума Ответить с цитированием
Старый 09.06.2012, 17:06   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Можно, конечно, ответить на все эти вопросы, но явно легче Вам не станет. Почитайте что-нибудь сначала, найдете ответы на все вопросы.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 09.06.2012, 17:32   #3
Qwoort
Пользователь
 
Аватар для Qwoort
 
Регистрация: 26.04.2009
Сообщений: 13
По умолчанию

Ну попробуйте, может пойму. Я знаю, например, что & - возвращает адрес, но причем он тут - "const Counter& Counter:: operator++()" - я не понимаю, адрес класса ведь возвратить нельзя, тут случай сугубо частный, поэтому я даже не знаю какой материал искать.
Смех без причины - признак Даламбера.
Qwoort вне форума Ответить с цитированием
Старый 09.06.2012, 18:22   #4
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Ваши вопросы означают, что Вы:

1) не знакомы со ссылками
2) не знаком с указателями
3) не знакомы с синтаксисом реализации функций классов

Складывается впечатление, что Вы взяли книгу по С++, прочитали отдельно каждую пятую страницу начиная с третьей и стали задавать вопросы, что несколько странно.

Теперь ответы.

1) Амперсанд означает ссылку.
2) В данном контексте rhs - имя. Его используют когда хотят его использовать.
3) Звездочка перед rhs.itsWeight стоит, скорее всего, потому что это указатель. Хотя не исключено, что это объект некоторого класса, для которого перегружен operator * (но вряд ли).
4) Преинкремент возвращает ссылку, поэтому там стоит амперсанд. Постинкремент возвращает значение, поэтому там нет амперсанда.
5) Первый - для возвращаемого значения, второй - для области видимости функции.
6) this - указатель на объект класса, для которого вызвана функция. Он неявно передается всем нестатическим функциям. Звездочка перед ним - потому что он указатель на Counter, а возвращаемое значение - Counter или Counter &.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 12.06.2012, 19:59   #5
Qwoort
Пользователь
 
Аватар для Qwoort
 
Регистрация: 26.04.2009
Сообщений: 13
По умолчанию

Спасибо, в большинстве разобрался. Но вот по 4 вопросу: большая ли разница, возвращать оператору ссылку или объект? Лично я в работе программы изменений не заметил, определив оператор сначала так:

Код:
Cls & Cls :: operator++()
{
    ++X;
    return *this;
}
а потом так (без амперсанда):

Код:
Cls Cls :: operator++()
{
    ++X;
    return *this;
}
Есть ли практическая разница между этими фрагментами кода?

И ссылку на что возвращает таким образом объявленный оператор?
Смех без причины - признак Даламбера.
Qwoort вне форума Ответить с цитированием
Старый 13.06.2012, 16:08   #6
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Разница огромная. Возвращая не ссылку, Вы фактически возвращаете копию объекта. Возвращение ссылки означает возвращение именно этого, изменяемого объекта.

Для преинкремента должен работать такой код:
Код:
++(++(++x));
Его правильную компиляцию как раз обеспечивают ссылки, объект инкрементируется три раза. Если возвращать копию, сам объект х проинкрементируется только один раз.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько вопросов DeFix Работа с сетью в Delphi 3 28.11.2011 13:48
Несколько вопросов. Miron86 Компоненты Delphi 3 09.09.2009 18:25
несколько вопросов fitc Общие вопросы Delphi 28 14.07.2009 21:20
Несколько вопросов Зубоскалик Общие вопросы Delphi 14 20.11.2008 14:28
Несколько Вопросов Дорст Общие вопросы Delphi 3 12.11.2007 09:18