Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

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

struct S {

  string name, address;

  int x;

};

Этот класс S имеет неявный конструктор S(), инициализирующий члены name и address, но не x

<p id="AutBody_Root618"><strong>A.12.3.1. Деструкторы</strong></p>

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

class Vector { // вектор чисел типа double

public:

  explicit Vector(int s):sz(s),p(new double[s]) { }

  // конструктор

  ~Vector() { delete[] p; }

  // деструктор

  // ...

private:

  int sz;

  double* p;

};

void f(int ss)

{

  Vector v(s);

  // ...

} // при выходе из функции f() объект v будет уничтожен;

  // для этого будет вызван деструктор класса Vector

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

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

<p id="AutBody_Root619"><strong>A.12.3.2. Копирование</strong></p>

Можно определить суть копирования объекта класса.

class Vector { // вектор чисел типа double

public:

  explicit Vector(int s):sz(s), p(new double[s]) { }

  // конструктор

  ~Vector() { delete[] p; }         // деструктор

  Vector(const Vector&);            // копирующий конструктор

  Vector& operator=(const Vector&); // копирующее присваивание

  // ...

private:

  int sz;

  double* p;

};

void f(int ss)

{

  Vector v(s);

  Vector v2 = v; // используем копирующий конструктор

  // ...

  v = v2;        // используем копирующее присваивание

  // ...

}

По умолчанию (т.е. если вы не определили копирующий конструктор и копирующее присваивание) компилятор сам генерирует копирующие операции. По умолчанию копирование производится почленно (см. также разделы 14.2.4 и 18.2). 

<p id="AutBody_Root620"><strong>A.12.4. Производные классы</strong></p>

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

struct B {

  int mb;

  void fb() { };

};

class D:B {

  int md;

  void fd();

};

В данном случае класс B имеет два члена: mb и fb(), а класс D — четыре члена: mb, fb(), md и fd().

Как и члены класса, базовые классы могут быть открытыми и закрытыми (public или private).

Class DD:public B1,private B2 {

  // ...

};

В таком случае открытые члены класса B1 становятся открытыми членами класса DD, а открытые члены класса B2 — закрытыми членами класса DD. Производный класс не имеет особых привилегий доступа к членам базового класса, поэтому члены класса DD не имеют доступа к закрытым членам классов B1 и B2.

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

Указатель на производный класс D можно неявно преобразовать в указатель на его базовый класс B при условии, что класс B является доступным и однозначным по отношению к классу D. Рассмотрим пример.

struct B { };

struct B1: B { }; // B — открытый базовый класс по отношению

                  // к классу B1

struct B2: B { }; // B — открытый базовый класс по отношению

                  // к классу B1

struct C { };

struct DD : B1, B2, private C { };

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных