23. Список инициализации конструктора Список инициализации указывается в описании конструктора основного класса.
Прототип конструктора со списком инициализации:
Имя_класса ( параметры ) : список_инициализации { тело_класса }
Список инициализации – последовательность разделенных запятой ини-циализируемых переменных встроенных типов и конструкторов для переменных, представляющих объекты типов описанных классов (пользовательских типов данных), а также необходимых конструкторов преобразования или конструкторов
двумя и более параметрами для базовых классов, от которых унаследован описываемый класс.
качестве инициализаторов переменных встроенных типов и параметров конструкторов могут выступать формальные параметры конструктора описы-ваемого класса. В случае использования списка инициализации тело конструктора может оказаться пустым. Но и в этом виде оно обязательно должно присутство-вать.
Пример:
class Z0{
int z01;
public:
Z0(){
z01 = 0;
}
Z0(int pz0){
z01 = pz0;
}
};
class Point{
int x, y;
public:
Point(): x(0), y(0){}
Point(int x1, const int y1): x(x1), y(y1){}
Point(const point& p1) : x(p1.x), y(p1.y){}
};
class Z1{
Point p, p2, p3;
int z;
public:
Z1(int z2, int x2, int y2, int pz01):
p2(x2,y2), p(pz01,0), p3(p2), z(z2){}
};
int main(){
z1* z3 = new z1(1,2,3,4);
return 0;
}
Недопустимо использование конструкторов с параметрами (даже констан-тами) при описании подобъектов классов (членов-данных, являющихся объек-тами других классов). Если подобъект класса необходимо инициализировать с использованием констант, то это можно сделать только в строке инициализации. Так, класс Z1 из приведенного только что примера не может быть описан сле-дующим образом:
class z1{
point p;
point
p2(2,3); //
ОШИБКА!
point p3;
int z;
public:
z1(int z2): p3(p2),z(z2){}
};
Правильное описание класса:
class z1{
point p, p2, p3;
int z;
public:
z1(int z2): p2(2,3),p3(p2),z(z2){}
};
31
Если бы в классе z1 были описаны несколько конструкторов, то в строку инициализации каждого из них необходимо было бы поместить вызов конструк-тора с двумя и более параметрами для поля p2. 29. Перегрузка бинарных операций
Перегрузка бинарных операций
Для перегрузки операций используется ключевое слово operator. Прототип перегруженной операции:
-
Тип_возвращаемого
operator
Символ
значения
оператора ( операнды){ тело_ функции };
Перегружать операции можно с помощью:
функции-члена;
функции-друга;
глобальной функции (как правило, менее эффективно).
41
Можно перегружать любые операции языка С++, кроме следующих:
.операция выбора члена класса
::операция разрешения области видимости
− ? : условная операция (например, j = i>0 ? 1 : 0;)
.*операция разыменования указателя на член класса
#директива препроцессора
sizeof
typeid
При перегрузке операции с помощью метода число формальных параметров оказывается на единицу меньше числа фактических операндов операции. В этом случае первый операнд операции соответствует объекту типа класса, в котором перегружается операция. В случае бинарной операции входной параметр соот-ветствует второму операнду перегружаемой операции.
При перегрузке операции с помощью функции-друга число формальных параметров совпадает с числом операндов операции, так как в этом случае опе-ранды операции , представленные формальными параметрами, являются внеш-ними объектами для такой функции.
Тип выходного параметра является встроенным типом или типом, опреде-ленным пользователем (то есть классом).
Если при перегрузке операции методом класса результатом применения операции является изменение первого (или единственного) операнда, то реко-мендуется объявлять выходной параметр в виде ссылки на текущий объект. Это необходимо для оптимизации использования результата операции в других опе-рациях, совмещенных в одном операторе, например: z = x += y;
Если при перегрузке операции функцией-членом результатом применения перегружаемого операции является вычисление значения, не изменяющего пер-вый операнд, а также при перегрузке операции функцией-другом, выходной па-раметр не может быть ссылкой (если выходной параметр требуется). Это связано с тем, что вычисляемое значение помещается во временный объект, который уничтожается при завершении работы алгоритма перегруженной операции и выходе из области видимости этого временного объекта.
35. Одиночное наследование. Преобразования указателей Одиночное наследование
10.1. Правила
наследования
Наследование
является одним из трех основных механизмов
ООЯП. В ре-зультате использования
механизма наследования осуществляется
формирование иерархических связей
между описываемыми типами. Тип-наследник
уточняет базовый тип.
Прототип
объявления типа-наследника:
class
struct
public
имя
типа : protected имя
базового типа
private
описание
членов
класса
