xztau
@xztau
Я

Объясните поведение кода на C++: когда создаются или уничтожаются экземпляры классов?

Здравствуйте! Несколько запутался после C#.

Помогите разобраться в следующих вопросах:
1) Сколько тут объектов Counter к концу программы?
2) При ++c1 создаётся объект?
3) Если присваивания ++c1 нет, как этот объект уничтожить?
4) с2 = ++с1 — что тут происходит с объектами?

// countpp2.cpp
// операция ++, возвращающий значение
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class Counter
{
  private:
    unsigned int count;
  public:
    Counter ( ) : count ( 0 )
      { }
    unsigned int get_count ( )
      { return count; }
    Counter operator++ ( )
      {
        ++count;
        Counter temp;
        temp.count = count;
        return temp;
      }
};
///////////////////////////////////////////////////////////
int main ( )
{
  Counter c1, c2;                        // определяем переменные

  cout << "\nc1 = " << c1.get_count ( ); // выводим на экран
  cout << "\nc2 = " << c2.get_count ( );

  ++c1;                                  // увеличиваем c1
  c2 = ++c1;                             // c1=2, c2=2

  cout << "\nc1 = " << c1.get_count ( ); // снова показываем значения
  cout << "\nc2 = " << c2.get_count ( ) << endl;

  return 0;
}
  • Вопрос задан
  • 2465 просмотров
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
В данной программе ровно два экземпляра класса Counter - c1 и с2.

При выполнении преинкремента ++с1 новых экземпляров не создается.

При выполнении преинкремента с последующим присваиванием сначала происходит инкремент c1, затем его значение переносится в c2. Экземпляры классов при этом не создаются и не уничтожаются.

Уничтожение c1 и с2 происходит после выхода из их области видимости - составного оператора, являющегося телом main.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
AxisPod
@AxisPod
Да так же как и в .NET, правда здесь они созданы на стеке, а не в куче.
Ответ написан
Комментировать
@DISaccount
Отладочная печать - поможет. Всегда самому интереснее разобраться ведь:
class Counter {
private:
	unsigned int count;
public:
	Counter() : count(0) {
		cout << "Counter ctor" << endl;
	}

	Counter(Counter const& other) {
		cout << "Counter copy ctor" << endl;
                this->count = other.count;
	}

	~Counter() {
		cout << "Counter dtor" << endl;
	}

	unsigned int get_count() {
		return count;
	}
	Counter& operator = (Counter const& other) {
		cout << "Counter operator()=" << endl;
		this->count = other.count;
		return *this;
	}

	Counter& operator++() {
		cout << "Counter operator()++" << endl;
		++count;
                //не делайте глупостей наподобие временных объектов Counter temp; temp.count = count;
		return *this;
	}
};
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы