Возврат объекта из функции-члена того же класса - PullRequest
0 голосов
/ 26 апреля 2011

Мне попалась следующая программа:

class Counter { 
 protected:         
  unsigned int count;  

 public:  
  Counter(): count(0) {}   
  Counter(int c): count(c) {}   
  unsigned int get_count() { return count; }  
  Counter operator++() { return Counter(++count); }  
};  

Что делает последняя функция-член (Counter(++count))?

Ответы [ 2 ]

6 голосов
/ 26 апреля 2011

Я думаю, что вы хотели реализовать operator++ для своего класса, и это должно быть реализовано как:

Counter & operator++()
{
   ++count;
   return *this;
}

Теперь вопрос в том, что он делает? Это делает предварительное увеличение. Теперь вы можете написать ++counter, и это вызовет вышеуказанную перегрузку оператора, и которое внутренне увеличит переменную count на 1.

Пример:

Counter counter(1);
++counter;
std::cout << counter.get_count() << std::endl;
++(++counter);
std::cout << counter.get_count() << std::endl;

Выход:

2
4

Что делает ваш оригинальный код?

Если вы попытаетесь запустить приведенный выше код, используя исходную реализацию operator++, будет напечатано следующее:

2
3

Это потому, что вы создаете другой временный объект, который вы возвращаете, и когда вы пишете ++(++counter), внешнее предварительное увеличение будет увеличивать временное значение. Таким образом, внешнее предварительное увеличение не изменит значение counter.count.

Даже если вы напишите ++(++(++(++counter))), это эквивалентно просто ++counter.

Сравните вывод здесь:

Примечание ++(++counter) НЕ вызывает неопределенного поведения .

3 голосов
/ 26 апреля 2011

Последняя функция - перегруженный оператор. Конкретно в префиксе приращения оператора. Это позволяет вам использовать оператор префикса ++ для объектов этого класса. Например:

  Counter counter;
  ++counter;
  // note this is not implemented
  counter++;

Эта строка

  Counter(++count)

создает новый объект Counter, сначала увеличивая количество текущих экземпляров, а затем используя конструктор

   Counter(int c)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...