Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
для шпор(печатаем 8 стр на листе).docx
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
2.86 Mб
Скачать

2. Объявление и определение класса. Внешнее определение функций.

Объявление - это просто его имя и параметры (class A()), а определение это уже со всеми функциями (class A(){})

class Screen; // объявление класса Screen

Это объявление вводит в программу имя Screen и указывает, что оно относится к типу класса.

Тип объявленного, но еще не определенного класса допустимо использовать весьма ограниченно. Нельзя определять объект типа класса, если сам класс еще не определен, поскольку размер класса в этом момент неизвестен и компилятор не знает, сколько памяти отвести под объект.

Однако указатель или ссылку на объект такого класса объявлять можно, так как они имеют фиксированный размер, не зависящий от типа. Но, поскольку размеры класса и его членов неизвестны, применять оператор разыменования (*) к такому указателю, а также использовать указатель или ссылку для обращения к члену не разрешается, пока класс не будет полностью определен.

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

class Screen { /* ... */ };

class Screen { /* ... */ } myScreen, yourScreen;

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

Каждое определение вводит новый тип данных. Даже если два класса имеют одинаковые списки членов, они все равно считаются разными типами:

class First {

int memi;

double memd;

};

class Second {

int memi;

double memd;

};

class First obj1;

Second obj2 = obj1; // ошибка: obj1 и obj2 имеют разные типы

Тело класса определяет отдельную область видимости. Объявление членов внутри тела помещает их имена в область видимости класса. Наличие в двух разных классах членов с одинаковыми именами – не ошибка, эти имена относятся к разным объектам.

После того как тип класса определен, на него можно ссылаться двумя способами:

• написать ключевое слово class, а после него – имя класса. В предыдущем примере объект obj1 класса First объявлен именно таким образом;

• указать только имя класса. Так объявлен объект obj2 класса Second из приведенного примера.

Оба способа сослаться на тип класса эквивалентны. Первый заимствован из языка C и остается корректным методом задания типа класса; второй способ введен в C++ для упрощения объявлений.

Внешнее определение - это внешнее объявление, которое также определяет объект или функцию

3. Создание, копирование и удаление объекта.

Объекты можно создавать разными способами. Некоторые объекты являются локальными переменными, некоторые — глобальными переменными, другие входят в состав более крупных объектов иных классов (являются членами классов) и т.д.

Создание объекта происходит в 2 этапа:

-Выделяется участок памяти, достаточный для хранения свойств объекта

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

Уничтожение объекта также происходит в 2 этапа

-Деинициализация

-Освобождение памяти, занимаемой объектом.

С.307 страуструп

Конструирование и уничтожение объектов

Рассмотрим различные способы создания и последующего уничтожения объектов классов. Объект может быть создан в качестве:

■ §10.4.4. Именованного автоматического объекта, создаваемого каждый раз при проходе потока управления работающей программы через его определение, и уничтожаемого по выходу из блока, содержащего указанное определение.

■ §10.4.5. Объекта в свободной памяти, создаваемого операцией new и уничтожаемого операцией delete.

■ §10.4.6. Нестатического члена классового типа, создаваемого в виде подобъекта в момент создания объемлющего объекта иного типа, и уничтожаемого в момент уничтожения указанного объемлющего объекта.

■ §10.4.7. Элемента массива, создаваемого и уничтожаемого в моменты создания и уничтожения самого массива.

■ §10.4.8. Локального статического объекта, создаваемого в момент первого прохождения потока управления работающей программы через его определение, и уничтожаемого в момент окончания работы программы.

■ §10.4.9. Глобального объекта, объекта из пространства имен или статического объекта класса, создаваемого при старте программу и уничтожаемого при завершении работы программы.

■ §10.4.10. Временного объекта, создаваемого в процессе вычисления выражения, и уничтожаемого после окончания вычисления полного выражения.

■ §10.4.11. Объекта, помещаемого в область памяти, предоставляемую функцией пользователя, с учетом параметров, передаваемых конструктору операцией размещения (placement new).

■ §10.4.12. Члена объединения (union), который не может иметь ни конструктора, ни деструктора.

Возможность копирования классовых объектов доступна изначально. В частности, объект класса можно инициализировать копией другого объекта того же класса; это можно делать и в случае, когда определены конструкторы. Например:

Date d = today; // инициализация копированием

По умолчанию, копия объекта класса содержит копии всех полей объекта. Если это не то, что нужно, следует явно определить копирующий конструктор {сору constructor) вида X: :X(const X&).

Аналогично, классовые объекты можно копировать с помощью операции присваивания (assignment operator). Например:

Void f(Date& d)

{

d = today;

}

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