Программирование >>  Арифметические и логические операции 

1 ... 5 6 7 [ 8 ] 9 10 11 ... 53


функция в базовом классе должна быть определена. Виртуальная функция, которая была определена в базовом классе, не нуждается в определении в производном классе.

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

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

Член функция с именем, совпадающим с именем ее класса, называется конструктором. Конструктор не имеет типа возвращаемого значения; он используется для конструирования значений с типом его класса. С помощью конструктора можно создавать новые объекты его типа, используя синтаксис:

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

Например:

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

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

Если класс имеет конструктор, то он вызывается для каждого объекта этого класса перед тем, как этот объект будет как-либо использован.

Конструктор может быть overload, но не virtual или friend. Если класс имеет базовый класс с конструктором, то конструктор для базового класса вызывается до вызова конструктора для производного класса.

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

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

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

Конструктор, получающий один параметр, определяет преобразование из типа своего параметра в тип своего класса. Такие преобразования неявно применяются дополнительно к обычным арифметическим преобразованиям.

Поэтому присваивание объекту из класса X допустимо, если или присваиваемое значение является X, или если X имеет конструктор, который получает присваиваемое значение как свой единственный параметр.

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

Например:

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)) не пробуется */

Деструкторы

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

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

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

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

Члены класса, описанные с ключевым словом class, являются закрытыми, это значит, что их имена могут использоваться только функциями членами и друзьями, пока они не появятся после метки public:. В этом случае они являются общими.



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

Если перед именем базового класса в описании производного класса стоит ключевое слово 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&);

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

Друзья (friends)

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

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 (&ob],10); ob].member set (10);

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

class cl2 friend cl1;

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

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

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

Где op:

♦+

♦-

♦ *

♦/

♦ %

♦ ♦ ♦

&



Структуры

<

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

>

struct s { ... };

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

class s { public: ... };

Структура может иметь функции члены (включая конструкторы и

деструкторы).

Объединения

Объединение можно считать структурой, все объекты члены кото-

рой начинаются со смещения 0, и размер которой достаточен для содержания любого из ее объектов членов.

&=

В каждый момент времени в объединении может храниться не

больше одного из объектов членов.

<<

Объединение может иметь функции члены (включая конструкто-

>>

ры и деструкторы).

<<=

Поля бит

>>=

Описатель члена вида:

идентификатор opt: константное выражение

определяет поле; его длина отделяется от имени поля двоеточием. Поля

упаковываются в машинные целые; они не являются альтернативой

<=

слов. Поле, не влезающее в оставшееся в целом место, помещается в сле-

>=

дующее слово. Поле не может быть шире слова.

&&

На некоторых машинах они размещаются справа налево, а на не-

которых слева направо. Неименованные поля полезны при заполнении

для согласования внешне предписанных размещений (форматов).

В особых случаях неименованные поля длины 0 задают выравни-

вание следующего поля по границе слова. Не требуется аппаратной под-

держки любых полей, кроме целых. Более того, даже целые поля могут

рассматриваться как unsigned.

По этим причинам рекомендуется описывать поля как unsigned. К

Последние две операции - это вызов функции и индексирование. Функция операция может или быть функцией членом, или получать по меньшей мере один параметр класса.

полям не может применяться операция получения адреса &, поэтому нет указателей на поля. Поля не могут быть членами объединения.



1 ... 5 6 7 [ 8 ] 9 10 11 ... 53

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика