Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
распечатать.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
160.66 Кб
Скачать

5. Перегрузка функций. Значение аргументов ф-ции по умолчанию. Примеры.

С++ поддерживает перегрузку операторов. За небольшими исключениями большинство операторов С++ могут быть перегружены, в результате чего они получат специальное значение по отношению к определённым классам. Например, класс, определяющий связанный список, может использовать оператор + для того, чтобы добавлять объект к списку. Другой класс может использовать оператор + совершенно иным способом. Когда оператор перегружен, ни одно из его исходных значений не теряет смысла. Просто для определённого класса объектов определён новый оператор. Поэтому перегрузка оператора + для того чтобы обрабатывать связный список, не изменяет его действия по отношению к целым числам.

Операторные функции обычно будут или членами, или друзьями того класса, для которого они используются. Несмотря на большое сходство, имеется определённое различие между способами, которыми перегружаются операторные функции-члены и операторные функции-друзья.

Для того, чтобы перегрузить оператор, необходимо определить, что именно означает оператор по отношению к тому классу, к которому он применяется. Общая форма записи функции-оператора для случая, когда она является членом классом класса, имеет вид:

тип имя_класса::operator#(список аргументов)

{

// действия, определённые применительно к классу

}

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

6. Наследование. Примеры.

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

Когда один класс наследуется другим, тот класс, который наследуется, называется базовым классом. Наследующий класс называется производным классом. Процесс наследования начинается с задания базового класса, который определяет все те качества, которые будут общими для всех производных от него классов. Базовый класс часто называют предком, производный - потомком.

Синтаксис наследования базового класса производным:

class имя_производного_класса: спецификатор_доступа имя_базового_класса

{

// объявление производного класса

};

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

а)

б)

.

Режим доступа к элементам базового класса из производного определяется спецификатором доступа, используемым при наследовании

Доступ в базовом классе

Спецификатор доступа при наследовании

Доступ в производном классе

public

protected

private

public

public (не изменяется)

protected (не изменяется)

private (не изменяется)

public

protected

private

protected

protected

protected (не изменяется)

private (не изменяется)

public

protected

private

private

private

private

private (не изменяется)

Конструкторы и деструкторы производных классов

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

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

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

Передача параметров в базовый класс

Когда базовый класс имеет конструктор с аргументами, производные классы должны передавать базовому классу необходимые аргументы. Для этого используется расширенная форма конструкторов производных классов.

порождённый_конструктор(список_аргументов): базовый1(список_аргументов), базовый2(список_аргументов), …, базовыйN(список_аргументов)

{

}

Здесь под базовый1, базовый2, …, базовыйN обозначены имена базовых классов, наследуемые производным классом. Обратим вниманием, что с помощью двоеточия конструктор производного класса отделяется от списка конструкторов базового класса. Список аргументов, ассоциированный с базовыми классами, может состоять из констант, глобальных переменных или параметров конструктора производного класса.

Указатели и ссылки на производные типы

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