Программирование. Принципы и практика использования C++ Исправленное издание, стр. 417
Date d4 = Date(2007*12*31+6*31+5); // OKf(Date(2007*12*31+6*31+5)); // OKЕсли базовые классы или члены производного класса не требуют явных аргументов и в классе нет других конструкторов, то автоматически генерируется конструктор по умолчанию (default constructor). Этот конструктор инициализирует каждый объект базового класса и каждый член, имеющий конструктор по умолчанию (оставляя члены, не имеющие конструкторы по умолчанию, неинициализированными). Рассмотрим пример.
struct S { string name, address; int x;};Этот класс
SS()addressxA.12.3.1. Деструкторы
Смысл операции удаления объекта (т.е. что произойдет, когда объект выйдет за пределы области видимости) можно определить с помощью деструктора (destructor). Имя деструктора состоит из символа
~class Vector { // вектор чисел типа doublepublic: 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).
A.12.3.2. Копирование
Можно определить суть копирования объекта класса.
class Vector { // вектор чисел типа doublepublic: 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).
A.12.4. Производные классы
Класс можно определить производным от других классов. В этом случае он наследует члены классов, от которых происходит (своих базовых классов).
struct B { int mb; void fb() { };};class D:B { int md; void fd();};В данном случае класс
Bmbfb()Dmbfb()mdfd()Как и члены класса, базовые классы могут быть открытыми и закрытыми (
publicprivateClass DD:public B1,private B2 { // ...};В таком случае открытые члены класса
B1DDB2DDDDB1B2Если класс имеет несколько непосредственных базовых классов (как, например, класс
DDУказатель на производный класс
DBBD