logo search
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.18.3.1 Определения функций старого стиля

Можно использовать синтаксис С для определений функций:

старое-определение-функции:

спецификации-описаний opt старый-описатель-функции

список-описаний opt тело-функции

старый-описатель-функции:

описатель ( список-параметров opt )

список-параметров:

идентификатор

список-параметров , идентификатор

Приведем пример:

max(a,b) int b; { return (a<b) ? b : a; }

Если определенная таким образом функция не была описана ранее, то тип

ее формальных параметров полагается (...), т.е. он не будет проверяться.

Если она была описана, то тип должен согласовываться с типом,

указанным в описании.

Приведенный синтаксис нельзя использовать для определения функций-членов.

R.18.3.2 Старый стиль задания инициализатора базового класса

В конструкции инициализатор-памяти ($$R.12.6.2) можно не указывать

имя-класса, обозначающее базовый класс при условии, что существует

только один прямой (непосредственный) базовый класс. Поэтому в

описании

class B {

// ...

public:

B(int);

};

class D : public B {

// ...

D(int i) : (i) { /* ... */ }

};

будет вызываться конструктор B с параметром i.

R.18.3.3 Присваивание указателю this

Присваивая определенные значения указателю this, пользователь мог

управлять выделением памяти для объекта некоторого класса. В

конструкторе до использования членов класса можно было с помощью

такого присваивания реализовать свой алгоритм выделения памяти.

Присваивая в деструкторе указателю this нуль, можно было

обойти стандартную операцию освобождения объектов класса. Кроме

того, присваивание нуля в деструкторе отменяло неявные вызовы

деструкторов для членов и базовых классов, например:

class Z {

int z[10];

Z() { this = my_allocator(sizeof(Z) ); }

~Z() { my_deallocator (this); this = 0; }

};

Если выделение памяти уже произошло (как бывает для членов и

объектов auto или static), то при входе в конструктор this имеет

ненулевое значение и значение нуль в противном случае.

Вызовы конструкторов для членов и базовых классов произойдут

только после того, как this получил значение. Если в конструкторе

базового класса есть присваивание this, то новое значение this

будет использоваться и в конструкторах производных классов, если

они есть.

Отметим, что при наличии указанного анахронизма или тип указателя

this не может быть *const, или нужно делать исключение для this из

правила о присваивании указателям со спецификацией const.