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

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

Жанры

Шрифт:

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

8.5.8 Свободная память

Когда с помощью операции new создается классовый объект, то для получения необходимой памяти конструктор будет (неяно) использовать operator new (#7.1). Конструктор может осществить свое собственное резервирование памяти посредством присваивания указателю this до каких-либо использований члна. С помощью присваивания this значения ноль деструктор мжет избежать стандартной операции дерезервирования памяти для объекта его класса. Например:

class cl (* int v[10]; cl (* this = my_own_allocator (sizeof (cl)); *) ~cl (* my_own_deallocator (this); this = 0; *) *) На входе в конструктор this являеется не-нулем, если рзервирование памяти уже имело место (как это имеет место для auto, static объектов и объектов членов), и нулем в остальных случаях. Вызовы конструкторов для базового класса и объектов члнов будут иметь место после присваивания указателю this. Если

конструктор базового класса осуществляет присваивание this, то новое значение также будет использоваться конструктором производного класса (если таковой есть).

При уничтожении вектора объектов класса с деструктором необходимо указывать число элементов. Например:

class X (* ... ~X; *); X* p = new X [size]; delete[size] p;

8.5.9 Видимость имен членов

Члены класса, описанные с ключевым словом class, являюся закрытыми, то есть, их имена могут использоваться только функциями членами (#8.5.2) и друзьями (см. #8.5.10), если они не стоят после метки «public:». В этом случае они являются открытыми. Открытый член может использоваться любой функцией. Struct является классом, все члены которого общие, см. #8.5.12.

Если производный класс описан как struct или если перед именем базового класса в описании производного класса стоит ключевое слово public, то общие члены базового класса являюся общими для производного класа; в остальных случаях они яляются закрытыми. Открытый член mem закрытого базового класса base может быть описан как общий для производного класса с помощью опиисания вида

typedef-имя :: идентификатор ;

в котором typedef-имя обозначает базовый класс, а идетификатор есть имя члена базового класса. Такое описание должно стоять в открытой части производного класса. Рассморим

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

class derived : base (* int d; public: base::c; int e; int df; *);

int ef(derived amp;);

Внешняя функция ef может использовать только имена c, e и df. Являясь членом производного derived, функция df может использовать имена b, c, bf, d, e и df, но не a. Являясь члном базового base, функция bf может использовать члены a, b, c и bf.

8.5.10 Друзья

Друг класса – это функция не-член, которая может исползовать имена закрытых членов. Друг не принадлежит области вдимости класса и не вызывается с помощью синтаксиса выбора члена (если он не является членом другого класса). Следующий пример иллюстрирует различия между членами и друзьями:

class private (* int a; friend void friend_set(private*, int); public: void member_set(int); *);

void friend_set (private* p, int i) (* p-»a = i; *)

void private::member_set (int i) (* a = i; *)

private obj; friend_set ( amp;obj,10); obj.member_set (10);

Если описание friend отностися к перегруженному имени или операции, то другом становится только функция, задаваемая типами параметров. Член класса cl1 может быть другом класса cl2. Например:

class cl2 (* friend char* cl1::foo(int); // ... *);

Все функции класса cl1 могут быть сделаны друзьями класа cl2 с помощью одного описания

class cl2 (* friend class cl1 ; // ... *);

Функция член, определенная (#10) в описании класса, яляется inline.

8.5.11 Функция операция

Большинство операций могут быть перегружены с тем, чтобы они могли получать в качестве операндов объекты класса.

имя_функции_операции: operator операция

операция: одна из new delete + – * / % ^ amp; ! ~ ! = « » += -= *= /= %= ^= amp;= != «„ “» «„= “»= == != «= »= amp; amp; !! ++ – []

Последние две операции – это вызов функции и индексирвание. Функция операция (за исключением operator new и operator delete; см. #7.2) должна быть или функцией членом, или получать по меньшей мере один классовый параметр. См. также #7.16.

8.5.12 Структуры

Структура есть класс, все члены которого общие. Это знчит, что

struct s (* ... *); эквивалентно

class s (* public: ... *);

Структура может иметь функции члены (включая конструктры и деструкторы). Базовй класс производной struct является открытым. Это значит, что

struct s : d (* ... *);

эквиволентно

class s : public b (* public: ... *);

8.5.13 Объединения

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

Объединение вида

union (* список_членов *);

называется безымянным объединением; оно определяет неменованный объект. Имена членов безымянного объединения долны отличаться от других имен в области видимости, в которой объединение описано; в этой области видимости они могут ипользоваться непосредственно, без обычного синтаксиса доступа к членам (#8.5). Например:

union (* int a; char* p; *); a = 1; // ... p = «asdf»;

Здесь a и p используются как простые переменные (не-члны), но так как они являются членами объединения, они имеют один и тот же адрес.

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

Точка Бифуркации VIII

Смит Дейлор
8. ТБ
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации VIII

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

Телохранитель Генсека. Том 3

Алмазный Петр
3. Медведев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Телохранитель Генсека. Том 3

Отмороженный 9.0

Гарцевич Евгений Александрович
9. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный 9.0

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Вперед в прошлое 10

Ратманов Денис
10. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 10

Запрети любить

Джейн Анна
1. Навсегда в моем сердце
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Запрети любить

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6

Зодчий. Книга I

Погуляй Юрий Александрович
1. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга I

Олд мани

Голд Яна
Любовные романы:
современные любовные романы
остросюжетные любовные романы
фемслеш
5.00
рейтинг книги
Олд мани

Черные ножи

Шенгальц Игорь Александрович
1. Черные ножи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черные ножи

Я снова граф. Книга XI

Дрейк Сириус
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я снова граф. Книга XI

Звездная Кровь. Экзарх III

Рокотов Алексей
3. Экзарх
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Экзарх III