Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы на экзаменн-е вопросы за 1-й курс. Препод- Рудой И.Б / Ответы / 03 Области видимости переменных. Конструкторы и деструкторы в Срр. Примеры

..doc
Скачиваний:
38
Добавлен:
25.05.2014
Размер:
37.89 Кб
Скачать

03 Области видимости переменных. Конструкторы и деструкторы в Срр. Примеры.

Область видимости

Каждое имя в С++ программе должно относиться к уникальной сущности (объекту, функции, типу или шаблону). Это не значит, что оно встречается только один раз во всей программе: его можно повторно использовать для обозначения другой сущности, если только есть некоторый контекст, помогающий различить разные значения одного и того же имени. Контекстом, служащим для такого различения, служит область видимости. В С++ поддерживается три их типа: локальная область видимости, область видимости пространства имен и область видимости класса.

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

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

Объекты, функции, типы и шаблоны могут быть определены в глобальной области видимости. Программисту разрешено задать пользовательские пространства им

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

C++ обеспечивает удобные способы создания и удаления объектов, через специальные процедуры. Процедуры создания объектов называются конструкторами, а процедуры уничтожения - деструкторами. Конструкторы автоматически вызываются при описании объекта, а деструкторы - при выходе из блока, в котором этот объект был описан. Если необходимые конструкторы или деструктор для класса не описаны, то транслятор создает их сам. Для того, чтобы понять важность конструкторов, сделаем маленькое отступление. Общей проблемой для всех традиционных языков программирования является инициализация: прежде чем использовать структуру данных, нужно выделить ей память и проинициализировать. Рассмотрим задачу инициализации следующей структуры:

class rectangle { // Прямоугольник

public:

int wd, ht; // Ширина и высота

};

Неопытные программисты могут попробовать присвоить значения элементам wd и ht следующим образом:

rectangle this_rect // Создание нового объекта this_rect

this_rect.wd = 20; // с заданной шириной

this_rect.ht = 10; // и высотой

Ошибки не будет, но такой способ тесно связан с конкретным объектом,

Конструкторы

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

class sber_bank { < Объявление класса

private:

double big_bucks;

public:

sber_bank(double bucks); < Конструктор

void deposit(double bucks);

double withdraw(double bucks);

};

Разберем порядок описания конструктора:

Селектор

Используемый класс Имя конструктора

v v v

sber_bank :: sber_bank(double bucks)

{

big_bucks = bucks; <

Вызов конструкторов

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

Имя Объект

класса

v v

sber_bank counterfeit_bank_of_AZ(1000000.00);

^ ^

Обусловлено вызовом конструктора

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

void doit(void)

{

sber_bank telly(1000.0); < Здесь вызывается конструктор

...

Деструкторы

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

class sber_bank {

private:

double big_bucks;

public:

sber_bank(double bucks); < Конструктор

~sber_bank(void); < Деструктор

void deposit(double bucks);

double withdraw(double bucks);

};

В объявленном выше классе деструктор определяется так:

Селектор

Используемый класс Имя деструктора

v v v

sber_bank :: ~sber_bank(void)

{

printf("Машина останавливается \n");

}

Деструктор также можно объявлять встроенным:

class sber_bank {

private:

double big_bucks;

public:

// Встроенный конструктор

sber_bank(double bucks) { big_bucks = bucks; }

// Встроены

Вызов деструкторов

Как и конструкторы, деструкторы могут вызываться явно (при помощи оператора С++ delete) или неявно - при выходе объекта из области действия, например:

void doit(void)

{

sber_bank telly(1000.0); < Здесь вызывается конструктор

...

} < Деструктор вызывается, когда выполнение завершается

Если вы не определите деструктор для данного класса, то С++ генерирует деструктор по умолчанию.