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

101. Все ли операции могут быть перегружены? Можно ли перегрузить операции для базовых стандартных типов данных?

Следующие операции не могут быть перегружены:

  • операции доступа к членам структуры или класса (.)

  • операция разрешения (::)

  • операция условия (?:)

  • операция ->

Кроме того, нельзя создавать новые операции (например, нельзя определить новую операцию возведения в степень **, которая есть в некоторых языках) и пытаться их перегрузить; перегружать можно только существующие операции.

Для базовых стандартных типов тоже нельзя ничего перегрузить.

102. Зачем используют ключевое слово operator?

Для перегрузки операторов.

Сначала пишут возвращаемый тип, зачем ключевое слово operator, затем саму операцию (напр. ++) и наконец список аргументов, заключенных в скобки. Такой синтаксис говорит компилятору о том, что если операнд принадлежит классу, то нужно вызвать функцию с таким именем, встретив в тексте программы эту операцию. (пример: Chislo operator++(); )

103. Укажите различные способы перегрузки операторов.

Можно перегружать как метод класса. Можно ещё как friend-функцию (для << и >> чаще всего)

Это называется операторы-члены и операторы-не-члены. Вроде как.

104. Укажите особенности перегрузки ++ -- ( стр 313)

++ есть постфиксный, а есть префиксный.

Так вот если мы перегружаем по-обычному, т.е.MyClass operator ++ () ; - это вот так считается за префиксный инкримент. А если написать MyClass operator ++ (int) ; или MyClass operator ++ (int a) ; - то это постфиксный вариант.

Аналогично и для --.

У операторов ++ и -- есть две формы: постфиксная и префиксная.

Перегрузка вида: <название класса>& [<название класса>::]operator ++ (){ <…> }; <название класса>& [<название класса>::]operator -- (){ <…> };

Является перегрузкой префиксной формы. Если же в качестве параметра в оператор ++ (--) передаётся переменная (тип) int, тогда это будет перегрузкой постфиксной формы:

<название класса>& [<название класса>::]operator ++ (int [<название переменной>]){ <…> }; <название класса>& [<название класса>::]operator -- (int [<название переменной>]){ <…> };

105. Определите понятие «конструктор копирования».

Конструктором копирования называется специальный конструктор применяемый для создания нового объекта как копии уже существующего.

Случаи вызова конструктора копирования:

  • объект создается на основе существующего объекта

  • объект передается в функцию по значению (копия)

  • объект возвращается из функции с помощью return

пример: Vector (const Vector &a);

106. Укажите особенности перегрузки унарных операторов.

Унарные операторы не принимают значения

107. Укажите особенности перегрузки бинарных операторов.

Бинарные операторы принимают значения :)

108. Опишите синтаксис описания производного класса.

class A{ //базовый класс

};

class B : public A{ } //public наследование

class C : protected A{ } //protected наследование

class Z : private A{ } //private наследование

109. Как в производном классе определяется доступность полей базового класса?

Весь класс наследуется в зависимости от типа наследования. Особенностью является то, что private-компоненты базового класса будут доступны только для методов базового класса.

private-члены базового класса не доступны наследнику

при private-наследовании private и protected базового становятся private

при protected-наследовании private и protected базового становятся protected

при public-наследовании private и protected базового остаются прежними

110. При порождении класса от базового класса с атрибутом public public-компоненты базового класса становятся ………..-компонентами производного класса.

public

111. При порождении класса от базового класса с атрибутом private public-компоненты базового класса становятся ………..-компонентами производного класса.

private

112. Укажите особенности использования указателей базового класса для производного класса.

Неизвестно куда указывает указатель – на базовый класс или на производный. Чтобы узнать, на какой указывает, есть куча способов. Но их за 5 минут не расскажешь. Если указатель указывает на производный класс, а не на базовый и в этих классах есть виртуальный метод, то при вызове его для указателя вызовется именно тот, который описан в производном классе.

113. Зачем виртуализируются методы класса?

При использовании наследования, возникает ситуация, когда нужно использовать указатель базового класса для элементов производного класса. В этом случае, если одна функция будет иметь одну реализацию в базовом классе, и совершенно другую в производном, в зависимости, является ли она виртуальной, результаты будут различные. Если необходимо, чтобы при вызове этой функции у данного указателя выполнялась реализация из производного класса, тогда эта функция должна быть виртуальной. Иначе, будет выполняться реализация из базового класса.

Пример:

class Base

{ public:

virtual void show() //виртуальная функция

{ cout << “Base\n”; }

};

class Derv1 : public Base // Производный класс 1

{ public:

void show()

{ cout << “Derv1\n”; }

};

class Derv2 : public Base // Производный класс 2

{ public:

void show()

{ cout << “Derv2\n”; }

};

int main()

{ Derv1 dv1; // Объект производного класса 1

Derv2 dv2; // Объект производного класса 2

Base* ptr; // Указатель на базовый класс

ptr = &dv1; //Адрес dv1 занести в указатель

ptr -> show() // Выполнить show()

ptr = &dv2; //Адрес dv2 занести в указатель

ptr -> show()// Выполнить show()

return 0; }

Итог программы : Derv1

Derv2

Следовательно, выполняются методы производных классов, а не базового.

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