Библиотека классов

[2] статический, который создается один раз при запуске программы и уничтожается при ее завершении;

[3] объект в свободной памяти, который создается операцией new и уничтожается операцией delete;

[4] объект-член, который создается в процессе создания другого класса или при создании массива, элементом которого он является.

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

4.1. Локальные переменные

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

void f(int i)

{

table aa;

table bb;

if (i>0) {

table cc;

// .

}

// .

}

Здесь aa и bb создаются (именно в таком порядке) при каждом вызове f(), а уничтожаются они при возврате из f() в обратном порядке - bb, затем aa. Если в текущем вызове f() i больше нуля, то cc создается после bb и уничтожается прежде него.

Поскольку aa и bb - объекты класса table, присваивание aa=bb означает копирование по членам bb в aa. Такая интерпретация присваивания может привести к неожиданному (и обычно нежелательному) результату, если присваиваются объекты класса.

4.2. Объекты класса как члены

Рассмотрим пример:

class classdef {

table members;

int no_of_members;

// .

classdef(int size);

~classdef();

};

Цель этого определения, очевидно, в том, чтобы classdef содержал член, являющийся таблицей размером size, но есть сложность: надо обеспечить вызов конструктора table::table() с параметром size. Это можно сделать, например, так:

classdef::classdef(int size)

:members(size)

{

no_of_members = size;

// .

}

Параметр для конструктора члена (т.е. для table::table()) указывается в определении (но не в описании) конструктора класса, содержащего член (т.е. в определении classdef::classdef()). Конструктор для члена будет вызываться до выполнения тела того конструктора, который задает для него список параметров.

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

Конструкторы вызываются в том порядке, в котором они заданы в описании класса.

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

Если конструктору члена не требуется параметров, то и не нужно задавать никаких списков параметров. Так, поскольку конструктор table::table() был определен со стандартным значением параметра, равным 15, достаточно такого определения:

classdef::classdef(int size)

: members(size), no_of_members(size)

{

// .

}

Тогда размер таблицы friends будет равен 15.

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

Рассмотрим вместо вхождения объектов класса в качестве членов традиционное альтернативное ему решение: иметь в классе указатели на члены и инициализировать члены в конструкторе:

class classdef {

table* members;

table* friends;

int no_of_members;

// .

};

classdef::classdef(int size)

{

members = new table(size);

friends = new table; // используется стандартный

// размер table

no_of_members = size;

// .

}

Поскольку таблицы создавались с помощью операции new, они должны уничтожаться операцией delete:

classdef::~classdef()

{

// .

delete members;

delete friends;

}

Такие отдельно создаваемые объекты могут оказаться полезными, но учтите, что members и friends указывают на независимые от них объекты, каждый из которых надо явно размещать и удалять. Кроме того, указатель и объект в свободной памяти суммарно занимают больше места, чем объект-член.

5. СОЗДАНИЕ ПРОГРАММЫ

Программа начинается помощью директивы #include подключим заголовочный файл iostream:

#include<iostream>//директива препроцессора

Эта директива указывает препроцессору добавить в программу содержимое файла iostream. Буквы io в слове iostream означает ввод(input) данных в программу и вывод(output) данных из программы. Схема ввода/вывода в языке С++ включает в себя несколько определений, которые находятся в файле iostream.

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

using namespace std;

Она называется директивой использования(using directive).

Подключаем класс kvartira:

class kvartira{}

Описание класса разбивается на две части, служебное слово public (общий), где описываются прототипы функций-элементов, имена, описанные в private(частный) части класса, могут использоваться только в функциях-членах. Содержимое общедоступного раздела составляет абстрактную часть конструкции, т.е. общедоступный интерфейс. Инкапсуляция данных в частном разделе обеспечивает сохранение целостности данных и называется сокрытием данных.

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

kvartira(int initialrazmer);

~kvartira();

Конструктор – это метод класса, имя которого совпадает с именем самого класса, они служат для создания и инициализации объектов класса, а деструктор удаляет из памяти отработавшие объекты и освобождают выделенную для них память. Деструктору всегда присваивается имя класса с символом тильды(~) вначале. Деструктор не принимает никаких аргументов и не возвращает никаких значений.

Getrazmer() объявляется, как функция доступа к данным-членам класса, эта функция возвращает текущее значение переменной класса itsrazmer. А функция Setrazmer(int razmer) изменяет значение переменной-члена itsrazmer. Также в общедоступном классе объявляется метод доступа meb().

В частном классе объявляется переменная itsrazmer.

Класс mebel, построен подобным способом, тольво в нем объявлено больше методов, определяющие мебель в программе.

kvartira::kvartira(int initialrazmer)

{

itsrazmer=initialrazmer;

}

Таким образом записан конструктор класса kvartira, деструктор же в данной программе не выполняет никаких действий, записывается он так:

kvartira::~kvartira()

{}

Getrazmer – это открытая функция обеспечения доступа, которая в подобной записи возвращает значение переменной-члена itsrazmer:


Страница: