Чтение онлайн

на главную - закладки

Жанры

Шрифт:

В функции члене ключевое слово this является указателем на объект, для которого вызвана функция.

Функция член может быть определена (#10) в описании класса, и в этом случак она является inline (#8.1). Например:

int b; struct x (* int f (* return b; *) int f (* return b; *) int b; *);

означает

int b; struct x (* int f ; int b; *); inline x::f (* return b; *)

Применение операции получения адреса к функциям членам допустимо. Однако, тип параметра результирующего указателя на функцию неопределн, поэтому любое использование его является зависимым от реализации.

8.5.3 Производные классы

В конструкции

сост идентификатор : public opt typedef-имя

typedef-имя должно означать ранее описанный класс, назваемый базовым классом для описываемого класса. Говорится, что последний выводится из предшествующего (является проиводным от него). По поводу смысла public см. #8.5.9. На члены базового класса можно ссылаться так, как если бы они были членами производного класса, за исключением тех случаев, кода имя базового члена было переопределено в производном класе; в этом случае для ссылки на скрытое имя можно использвать операцию :: (#7.1). Производный класс сам может использоваться в качестве базового класса. Невозможно стристь производные от union (#8.5.13). Указатель на производный класс может неявно преобразовываться в указатель на открытый

базовый класс (#6.7).

Для объектов класса, производного от класса, для которго была определена operator= (#8.5.11), присваивание неявно не определено (#7.14 и #8.5)

Например:

class base (* int a, b; *);

class derived : public base (* int b, c; *);

derived d;

d.a = 1; d.base::b = 2; d.b = 3; d.c = 4;

осуществляет присваивание четырем членам d.

8.5.4 Виртуальные функции

Если базовый класс base содержит virtual (виртуальную) (#8.1) функцию vf, а производный класс derived также содержит функцию vf, то обе функции должны иметь один и тот же тип, и вызов vf для объекта класса derived вызывает derived::vf. Например:

struct base (* virtual void vf ; void f ; *);

class derived : public base (* void vf ; void f ; *);

derived d; base* bp = amp;d; bp-»vf; bp-»f;

Вызовы вызывают, соответственно, derived::vf и base::f для объекта класса derived, именованного d. Так что интерпртация вызова виртуальной функции зависит от типа объекта, для которого она вызвана, в то время как интерпретация вызова нвиртуальной функции зависит только от типа указателя, обознчающего объект.

Виртуальная функция не может быть другом (friend) (#8.5. 10). Функция f в классе, выведенном из класса, который имеет виртуальную функцию f, сама считается виртуальной. Виртуалная функция в базовом классе должна быть определена. Виртальная функция, которая была определена в базовом классе, не обязательно должна определяться в производном классе. В этом случае во всех вызовах используется функция, определенная для базового класса.

8.5.5 Конструкторы

Функция член с именем, совпадающим с именем ее класса, называется конструктором. Если класс имеет конструктор, то он вызывается для каждого объекта этого класса перед тем, как этот объект будет калибо использован, см. #8.6.

Конструктор не может быть virtual или friend.

Если класс имеет базовый класс или объекты члены с контрукторами, их конструкторы вызываются до конструктора проиводного класса. Первым вызывается конструктор базового класа. Объяснение того, как для таких конструктороу могут специфицироваться параметры , см. в #10, а того, как контрукторы могут использоваться для управления свободной пмятью, см. в #8.5.8.

Объект класса с конструктором не может быть членом обединения.

Для конструктора нельзя задать возвращаемое значение, как нельзя использовать оператор return в теле конструктора.

Конструктор может явно применяться для создания новых объектов его типа используя синтаксис

typedef-имя ( список_параметров opt )

Например,

complex zz = complex (1,2.3); cprint (complex (7.8,1.2));

Объекты, созданные таким образом, не имеют имени (если только конструктор не использован как инициализатор, как это было с zz выше), и их время жизни ограничено областью видмости, в которой они созданы.

8.5.6 Преобразования

Конструктор, получающий один параметр, определяет преоразование из типа своего параметра в тип своего класса. Такие преобразования неявно применяются дополнительно к стандартным пробразованиям (#6.6-7). Поэтому присваивание объекту из класса X допустимо, если тип T присваиваемого значения есть X, или если было описано преобразование из T в X. Аналогично конструкторы используются для преобразования инициализаторов (#8.6), параметров функции (#7.1) и возвращаемых функцией значений (#9.10). Например:

class X (* ... X (int); *); f (X arg) (* X a = 1; // a = X (1) a = 2; // a = X (2) f (3); // f (X (3)) *)

Если ни один конструктор для класса X не получает приваиваемый тип, то не делается никаких попыток отыскать другие конструкторы для преобразования присваиваемого значения в тип, который мог бы быть приемлем для конструкторов класса X. Например: class X (* ... X (int); *); class X (* ... Y (X); *); Y a = 1; // недопустимо: Y (X (1)) не пробуется Функция член класса X с именем вида имя_функции_преобразования:

operator тип

задает преобразование из X в тип. Тип не может содержать описания [] «вектор из» или «функция, возвращающая». Оно будет применяться неявно аналогично конструкторам выше (толко если оно единственно: #8.9), или его можно вызвать явно с помощью записи приведения к типу. Например:

class X (* // ... operator int; *);

X a; int i = int(a); i = (int)a; i = a;

Во всех трех случаях значене будет преобразовываться функцией X::operator int. Применение определяемых пользовтелем преобразований не сводится только к присваиваниям и инициализациям. Например:

X a, b; // ... int i = (a) ? 1+a : 0; int j = (a amp; amp;b) ? a+b : i;

8.5.7 Деструкторы

Функция член класса cl с именем ~cl называется деструтором. Деструктор не возвращает никакого значения и не полчает никаких параметров; он используется для уничтожения знчений типа cl непосредственно перед уничтожением содержащего их объекта. Деструктор не может быть вызван явно.

Деструктор для базового класса выполняется после десруктора производного от него класса. Деструкторы для объектов членов выполняются после деструктора для объекта, членом кторого они являются. Как деструкторы используютя для управлния свободной памятью, см. объяснение в #8.5.8.

Поделиться:
Популярные книги

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Идеальный мир для Лекаря 25

Сапфир Олег
25. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 25

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

Дважды одаренный. Том II

Тарс Элиан
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Дважды одаренный. Том II

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Лекарь Империи

Карелин Сергей Витальевич
1. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи

Фишер. По следу зверя. Настоящая история серийного убийцы

Рогоза Александр
Реальные истории
Документальная литература:
истории из жизни
биографии и мемуары
5.00
рейтинг книги
Фишер. По следу зверя. Настоящая история серийного убийцы

Казачий князь

Трофимов Ерофей
5. Шатун
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Казачий князь

Как я строил магическую империю 13

Зубов Константин
13. Как я строил магическую империю
Фантастика:
постапокалипсис
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Как я строил магическую империю 13

Искатель 4

Шиленко Сергей
4. Валинор
Фантастика:
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Искатель 4

Моя простая курортная жизнь 7

Блум М.
7. Моя простая курортная жизнь
Фантастика:
дорама
гаремник
5.00
рейтинг книги
Моя простая курортная жизнь 7

Мое ускорение

Иванов Дмитрий
5. Девяностые
Фантастика:
попаданцы
альтернативная история
6.33
рейтинг книги
Мое ускорение