Программирование. Принципы и практика использования C++ Исправленное издание, стр. 229
Shape* fct(){ Text tt(Point(200,200),"Annemarie"); // ... Shape* p = new Text(Point(100,100),"Nicholas"); return p;}void f(){ Shape* q = fct(); // ... delete q;}Этот код выглядит логичным — и он действительно логичен. Все работает, но посмотрите, как именно работает, ведь этот код является примером элегантного, важного и простого метода. При выходе из функции
fct()ttTextTextstringstringvectorttTextTextfct()f()qTextShapedelete qTextВ разделе 14.2.1 мы вскользь упомянули о том, что класс
ShapeShapedelete qdeleteqdelete q~Shape()Shape~Shape()Shape~Text()Shape::~Shape()Text::~Text()Textstring
1. Если класс имеет виртуальную функцию, то, скорее всего, он будет использован в качестве базового.
2. Если класс является базовым, то его производный класс, скорее всего, будет использовать оператор
new3. Если объект производного класса размещается в памяти с помощью оператора
newОбратите внимание на то, что деструкторы вызываются неявно или косвенно с помощью оператора
deleteПОПРОБУЙТЕ
Напишите небольшую программу, используя базовые классы и члены, в которых определены конструкторы и деструкторы, выводящие информацию о том, что они были вызваны. Затем создайте несколько объектов и посмотрите, как вызываются конструкторы и деструкторы.
17.6. Доступ к элементам
Для того чтобы нам было удобно работать с классом
vectorget()set()// очень упрощенный вектор чисел типа doubleclass vector { int sz; // размер double* elem; // указатель на элементыpublic: vector(int s): sz(s), elem(new double[s]) { /* */} // конструктор ~vector() { delete[] elem; } // деструктор int size() const { return sz; } // текущий // размер double get(int n) const { return elem[n]; } // доступ: чтение void set(int n, double v) { elem[n]=v; } // доступ: запись};Функции
get()set()[]elemТеперь мы можем создать вектор, состоящий из чисел типа
doublevector v(5);for (int i=0; i<v.size(); ++i) { v.set(i,1.1*i); cout << "v[" << i << "]==" << v.get(i) << '\n';}Результаты выглядят так:
v[0]==0v[1]==1.1v[2]==2.2v[3]==3.3