Программирование. Принципы и практика использования C++ Исправленное издание, стр. 243
// ... explicit vector(int); // ...};vector v = 10; // ошибка: преобразования int в vector нетv = 20; // ошибка: преобразования int в vector нетvector v0(10); // OKvoid f(const vector&);f(10); // ошибка: преобразования int в vector нетf(vector(10)); // OKДля того чтобы избежать неожиданных преобразований, мы — и стандарт языка — потребовали, чтобы конструктор класса
vectorexplicitexplicitexplicit118.3.2. Отладка конструкторов и деструкторов
vector(2)vectornew• Когда создается объект класса
X• Когда уничтожается объект типа
XДеструктор вызывается всегда, когда уничтожается объект класса; это происходит, когда объект выходит из области видимости, программа прекращает работу или к указателю на объект применяется оператор
deletenewЧто же при этом происходит? Для того чтобы понять это, добавим в конструкторы, операторы копирующего присваивания и деструкторы операторы вывода. Рассмотрим пример.
struct X { // простой тестовый класс int val; void out(const string& s) { cerr << this << "–>" << s << ": " << val << "\n"; } X(){ out("X()"); val=0; } // конструктор по умолчанию X(int v) { out( "X(int)"); val=v; } X(const X& x){ out("X(X&) "); val=x.val; } // копирующий // конструктор X& operator=(const X& a) // копирующее присваивание { out("X::operator=()"); val=a.val; return *this; } ~X() { out("~X()"); } // деструктор};Проследим, что происходит при выполнении операций над объектом класса
XX glob(2); // глобальная переменнаяX copy(X a) { return a; }X copy2(X a) { X aa = a; return aa; }X& ref_to(X& a) { return a; }X* make(int i) { X a(i); return new X(a); }struct XX { X a; X b; };int main(){ X loc(4); // локальная переменная X loc2 = loc; loc = X(5); loc2 = copy(loc); loc2 = copy2(loc); X loc3(6); X& r = ref_to(loc); delete make(7); delete make(8); vector<X> v(4); XX loc4; X* p = new X(9); // объект класса Х в свободной памяти delete p; X* pp = new X[5]; // массив объектов класса X // в свободной памяти delete[]pp;}Попробуйте выполнить эту программу.
ПОПРОБУЙТЕ
Мы имеем в виду следующее: выполните эту программу и убедитесь, что понимаете результаты ее работы. Если понимаете, то вы знаете почти все, что требуется знать о создании и уничтожении объектов.
copy()copy2()Так зачем же возиться с этим “глупым классом
X