서형박 Ответов: 1

<C++> У меня есть вопрос о вызове конструктора класса


class Gun
{
	int bullet;
public:
	Gun(int num) : bullet(num) {}
	void SD() { cout << bullet << endl; }
};

class Police
{
	int hand;
	Gun* pistol;
public:
	Police(int num, int hand) : hand(hand)
	{
		if (num > 0)
			pistol = new Gun(num);
		else
			pistol = NULL;
	}
	void SD()
	{
		pistol->SD();
		cout << hand << endl;
	}
	Police(const Police& ref) : hand(ref.hand)
	{
		if (ref.pistol != NULL)
			pistol = new Gun(*(ref.pistol));
	}
};


Что я уже пробовал:

Этот код является частью примера кода для книги, которую я изучаю. Однако в процессе динамического присвоения в конструкторе копирования класса Police объект *(ref.pistol) вставляется во время вызова конструктора. Как такое возможно?

KarstenK

Компилируется ли этот код? Мне не хватает подходящего конструктора Gun ().:- O

서형박

Для удобства чтения я импортировал только основной код вопроса

1 Ответов

Рейтинг:
5

Richard MacCutchan

1. Police(const Police& ref) : hand(ref.hand)
2. {
3.     if (ref.pistol != NULL)
4.         pistol = new Gun(*(ref.pistol));
5. }

Линия 1 использует ref в качестве ссылки на копируемый объект. Строка 3 проверяет, содержит ли указанный объект допустимый указатель на a Gun объект. Если это так (строка 4), то ссылка используется для создания нового Gun объект в новостройке Police объект.


서형박

в строке 4 *(см. пистолет) - это объект. Однако можно ли передать объект в качестве аргумента конструктору?

Richard MacCutchan

Да, именно это и происходит. ref.pistol является указателем на Gun объект, а предыдущая Звездочка является оператором разыменования, поэтому конструктору передается фактический объект, а не его указатель.

서형박

Пистолет (* (ref.pistol)) Это та часть, которая вызывает конструктор копирования по умолчанию класса Gun?

Richard MacCutchan

Да, я так думаю, хотя меня всегда смущают конструкторы копирования. Я удивлен, что ваша книга не объясняет этого.

서형박

Извини, что все время спрашиваю тебя об основах.

Richard MacCutchan

Нет проблем, это интересный вопрос.