Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
otvety_na_voprosy_po_proge.doc
Скачиваний:
6
Добавлен:
01.03.2025
Размер:
246.27 Кб
Скачать

97. Можно ли построить класс без конструктора? Как в этом случае описать объекты класса?

Если в классе не определить конструктор (хотя бы один), тогда компилятор создаст конструктор по умолчанию. Можно будет дать возможность пользователю изменять переменные самостоятельно, или же определить функции, которые будут изменять значения переменных.

Определить конструктор в закрытой части можно. В этом случае доступ к конструктору может получить только дружественный класс, который должен быть объявлен как дружественный в объявлении данного класса.

98. Когда вызывается конструктор? Наследуется ли конструктор? Укажите синтаксис списка инициализаций при вызове конструктора. Можно ли определить конструктор в закрытой секции? Можно ли явно вызвать конструктор?

Конструктор вызывается в момент создания объекта. Конструктор не наследуется.

class my

{ const int a,b,c;

public:

my(могут быть параметры): a(5),b(3),c(4){};

};

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

Нет, вызвать явно конструктор нельзя.

99. Определите понятие «дружественная функция ».

Это функция, которая не является методом класса, но имеет доступ к его закрытой части. Дружественная функция может обращаться ко всем его элементам, включая private и protect. Одна и та же функция может быть дружественной для двух или более классов.

class point

{public:

friend void point::Clear(point*); // Функция Clear объявляется дружественной классу point

private:

int m_x;

int m_y; };

void Clear(point* ptrPoint) // Функция Clear

{ ptrPoint->m_x = 0; // Обращаемся к элементам класса, объявленным как private

ptrPoint->m_y = 0;

return;}

void main()// Главная функция

{ point pointTestPoint;

Clear(&pointTestPoint); // Вызываем дружественную функцию

}

100. Опишите синтаксис деструктора.Зачем виртуализировать деструктор? Можно ли наследовать деструктор?Можно ли явно вызвать деструктор?

class A

{

public:

~A();

}

A:: ~A() { …}

Деструктор тоже ничего не возвращает и имеет название, совпадающее с именем класса, но перед ним стоит ~. Деструктор всегда ничего не принимает. Когда имеется иерархия классов, невозможно точно определить, куда указывает указатель. И тогда операция delete не будет работать. Объявив деструктор виртуальным, мы гарантируем, что для каждого производного класса будет замещен деструктор и объект правильно удалится.

Пример:

class Base

{ public:

~Base() //невиртуальный деструктор

//virtual ~Base()// виртуальный дестркутор - закоментен

{ cout << “Base удален\n”; }

};

class Derv : public Base

{ public:

~Derv()

{ cout << “Derv удален\n”; }

};

int main()

{ Base* pBase = new Derv;

delete pBase;

return 0;

}

Результат программы : Base удален //результат ошибочен, к такому результату привело то, что деструктор базового класса в приведенном листинге не виртуальный. Исправить это можно, заккоментировав первую строчку определения дестркуктора и активизировать другую.

Результатом будет: Derv удален

Base удален

Наследовать деструктор нельзя. Явно вызвать деструктор вызвать …

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]