КИТ и Э КБГУ Вторник, 07.05.2024, 01:18
Приветствую Вас Гость | RSS
Меню сайта

Наш опрос
Оцените мой сайт
Всего ответов: 118

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Конструктор класса. Деструктор класса. Друзья класса.

Вложенные классы

1. Конструкторы класса

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

Эту функцию легко распознать - она имеет то же имя, что и ее класс:

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

Значения, которыми  инициализируются данные-члены класса, передаются через параметры конструктора.

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

Если класс совсем не имеет конструкторов, то компилятор сам генерирует конструктор по умолчанию, который имеет следующий прототип:

public: inline имя_класса();

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

Если конструктор копирования не определен, то компилятор сам генерирует конструктор копирования. Этот конструктор имеет следующий прототип:

public: inline имя_класса(const имя_класса&);

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

  • 7.

class date {

// ...

date(int, int, int);

  •  

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

date today = date(23,6,1983);

date xmas(25,12,0);                                    // краткая форма

date my_birthday;                                                // неправильно, нужен инициализатор

Часто бывает удобно указать несколько способов инициализации объекта. Для этого нужно описать несколько конструкторов:

class date {

int month, day, year;

  •  

// ...

date(int, int, int); // день, месяц, год

date(int, int); // день, месяц и текущий год

date(int); // день и текущие год и месяц

date(); // стандартное значение: текущая дата

date(const char*); // дата в строковом представлении

  •  

 

2. Деструкторы класса

Деструктор  это  функция-член  класса,  имя  которой  совпадает  с именем класса, но перед ним дополнительно ставится символ ‘~’(тильда). Деструктор класса не имеет параметров.

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

  • если во время своего существования объект захватывал память при помощи оператора new, то эту память можно освободить в деструкторе при помощи оператора delete.

Если ресурсы освобождать не нужно, то деструктор не пишется. В этом случае компилятор генерирует деструктор по умолчанию, который выполняет следующие действия: сначала вызывает деструкторы данных-членов класса, а затем вызывает деструкторы базовых классов.

Пример 8.

В нашем случае объекты класса IntBox ресурсы не захватывают, поэтому деструктор для этого класса не нужен.

 

3. Друзья класса

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

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

Определяются функции-друзья класса как обычные функции внутри или вне класса. Если функция, друг класса, определяется вне класса, то ключевое слово friend не используется.

Пример 9.

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

class IntBox

{

bool empty;                                       // состояние контейнера

int room;                                            // место для хранения целого числа

public:

IntBox();                                            // конструктор

void put(int n);                                  // положить целое число в контейнер

int get();                                             // взять целое число из контейнера

bool isEmpty();                                 // проверить, свободно ли место

friend void in(IntBox& box);             // ввод числа с консоли

  • void out(IntBox& box);                    // вывод числа на консоль

};

Эти функции могут быть реализованы вне класса следующим образом.

void in(IntBox& box)

{

cin >> box.room;

box.empty = false;

}

void out(IntBox& box)

{

cout <<box.room;

box.empty = true;

  •  

 

Функция-друг не имеет никаких особенностей, за исключением права доступа к закрытой части класса. В частности, в такой функции нельзя использовать указатель this, если только она действительно не является членом класса. Описание friend является настоящим описанием. Оно вводит имя функции в область видимости класса, в котором она была описана, и при этом происходят обычные проверки на наличие других описаний такого же имени в этой области видимости. Описание friend может находится как в общей, так и в частной частях класса, это не имеет значения.

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

Функция-член одного класса может быть другом другого класса:

class x {

// ...

void f();

  •  

class y {

// ...

friend void x::f();

  •  

Вполне возможно, что все функции одного класса являются друзьями другого класса. Для этого есть краткая форма записи:

class x {

friend class y;

  •  

В результате такого описания все функции-члены y становятся друзьями класса x.

Иногда полезно делать явное различие между именами членов классов и прочими именами. Для этого используется операция :: (разрешения области видимости):

class X {

int m;

  •  

int readm() const { return m; }

void setm(int m) { X::m = m; }

  •  

В функции X::setm() параметр m скрывает член m, поэтому к члену можно обращаться, только используя уточненное имя X::m. Правый операнд операции :: должен быть именем класса.

Начинающееся с :: имя должно быть глобальным именем. Это особенно полезно при использовании таких распространенных имен как read, put, open, которыми можно обозначать функции-члены, не теряя возможности обозначать ими же функции, не являющиеся членами.

4. Вложенные классы

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

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

Вход на сайт

Поиск

Календарь
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Архив записей

Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz

  • Copyright Fatima_Zh © 2024Бесплатный хостинг uCoz