Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_С++_последная.doc
Скачиваний:
40
Добавлен:
07.05.2019
Размер:
876.54 Кб
Скачать

8.2.1. Конструкторы и параметры

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

class Money

{ public: // конструктор инициализации без аргументов

Money(const double &r = 0.0) { Summa = d; }

friend bool operator==(const TMoney &a, const TMoney &b);

friend bool operator!=(const TMoney &a, const TMoney &b)

private:

double Summa:

};

// реализация дружественных функций

bool operator==(const TMoney &a, const TMoney &b)

{ return (a.Summa == b.Summa); }

bool operator!=(const TMoney &a, const TMoney &b)

{ return !(a == b); }

void fl(Money t); // по значению

void f2(Money *t); // по адресу

void f3(const Money &t); // по константной ссылке

void f4(Money &t); // по ссылке

Money d2(100.67); // инициализация

fl(d2); // по значению -

// вызов конструктора копирования

f2(&d2); // по адресу -

// конструкторы не вызываются

f3(d2); // по константной ссылке - не вызываются

f4(d2): // по ссылке - не вызываются

Конструкторы позволяют более естественным образом задавать значения параметров по умолчанию:

void f1 (Money t = 100);

void f3(const Money &t = 200);

void f2(Money *t - new Money);

void f2(Money *t = new ТМопеу(300));

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

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

1. Инициализировать в списке инициализации можно и константные поля, и обычные поля-переменные.

2. Независимо от порядка перечисления полей в списке инициализации, поля получают значения в порядке объявления в классе.

3. В качестве инициализирующего выражения можно задавать любое вычисляемое выражение (не обязательно константное), результатом которого является значение того же (или приводимого) типа, что и тип инициализируемого поля; для полей типа класс выполняется вызов конструктора.

4. Для инициализации поля встроенного типа нулем используется специальная форма инициализатора имя_поля() – выражение не задается; для поля-объекта некоторого класса вызывается конструктор без аргументов (по умолчанию).

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

6. Список инициализации выполняется до начала выполнения тела конструктора.

Контрольные вопросы

1. Перегрузка операций.

2. Перегрузка операций внешними функциями.

3. Перегрузка операций методами класса.

4.  Конструкторы и деструктор.

5. Конструкторы и параметры.

Лекция 9.

Наследование. Введение в Visual C++.

Наследованиеэто третий «кит» (наряду с инкапсуляцией и полиморфизмом), на котором стоит объектно-ориентированное программирование. При наследовании обязательно имеются класс-предок (родитель, порождающий класс) и класс-наследник (потомок, порожденный класс). В C++ порождающий класс называется базовым, а порожденный класс – производным. Все термины эквивалентны.

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