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

13) Класс как область видимости

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

имя_класса :: имя_члена_класса или

:: имя - для имен глобальных функций и переменных.

Пример:

int ia1;

void f1(int b1) {

ia1 = ia1 + b1; }

class x {

int ia1;

public:

x(){ia1 = 0;}

void f1(int b1){

::f1(b1); // вызов глобальной функции

}

};

int main(){

x a2;

a2.f1(2);

return 0; }

19) Конструктор преобразования и конструкторы с двумя и более параметрами

Если для создания объекта необходимы параметры, то они указываются в круглых скобках после идентификатора переменной:

box b2(1,2,3);

box b3(5);

Указываемые параметры являются параметрами конструктора класса. Если у конструктора имеется ровно один входной параметр, который не представляет собой ссылку на свой собственный класс, то соответствующий конструктор называется конструктором преобразования. Этот конструктор называется так в связи с тем, что в результате его работы на основе объекта одного типа создается объект другого типа (типа описываемого класса).

Если уже описан класс T и описывается новый класс X, то его конструкторы преобразования могут иметь любой из следующих прототипов:

X(T);

X(T&);

X(const T&);

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

class X {

int x1;

public:

X(int px1 = 0}

};

Для такого класса будут верны следующие объявления объектов:

int main(){

… Х x1, x2(1); … }

25) Порядок вызова конструкторов и деструкторов

Итак, конструкторы можно классифицировать по набору входных парамет- ров следующим образом: 1) x() – конструктор умолчания

2) x(x&), x(const x&) – конструктор копирования

3) x(t), x(t&), x(const t&) – конструктор преобразования

4) конструктор с двумя и более параметрами

При создании объекта конструкторы вызываются в следующем порядке:

1) Конструкторы базовых классов, если класс для создаваемого объекта является наследником других классов в порядке их появления в описании класса. Если в списке инициализации описываемого класса присутствует вызов конструктора преобразования (или конструктора с двумя и более параметрами) базового класса, то вызывается конструктор преобразования (или конструктор с двумя и более параметрами), иначе вызывается конструктор умолчания базового класса.

2) Конструкторы умолчания всех вложенных информационных членов, которые не перечислены в списке инициализации, и конструкторы преобразования, копирования и конструкторы с двумя и более параметрами всех вложенных информационных членов, которые перечислены в списке инициализации. Все перечисленные в данном пункте конструкторы (умолчания, преобразования, копирования, с двумя и более параметрами) вызываются в порядке описания соответствующих информационных членов в классе.

3) Собственный конструктор. Такая последовательность вызова конструкторов логически обосновывается тем, что в момент выполнения собственного конструктора все информационные поля должны быть уже проинициализированы.

Деструкторы вызываются в обратном порядке:

1) Собственный деструктор. В момент начала его работы поля класса еще не очищены, и их значения могут быть использованы в теле деструктора.

2) Деструкторы вложенных объектов в порядке, обратном порядку их описания.

3) Деструкторы базовых классов в обратном порядке их задания.

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