Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
88
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

16 Еще о класcах

16.1 Статические элементы

Элемент данных, определенный как static, является общим для всех объектов данного класса. Память под статический элемент выделяется, даже если не существует никаких объектов класса. Хотя к статическому элементу данных, объявленному как public, можно обратиться по составному имени

объект_класса. элемент

или

указатель_на_объект->элемент,

для ясности лучше использовать форму

имя_класса :: элемент.

Статическим функциям-элементам не передается при вызове указатель this. Из этого следует, что статическая функция-элемент может вызываться независимо от того, существует или нет какой-либо представитель класса, может обращаться только к статическим элементам и функциям класса, и не может объявляться как virtual.

16.2 Друзья класса

Язык С++ позволяет сделать некоторую функцию или класс другом данного класса и тем самым наделить их особым правом доступа к его элементам. Все элементы становятся доступными независимо от того, как они описаны: private или protected.

Чтобы сделать функцию или другой класс другом данного, достаточно объявить их в данном классе с описателем friend. Например,

class myClass

{

// дружественная функция

friend void FriendFunc( );

// дружественный метод класса “Class”

friend void Class::MemberFuncName( );

// дружественный класс

friend class FriendClass;

...

}

К дружественности приложимы следующие правила:

— дружественность не симметрична: если А объявляет В другом, это не означает автоматически, что А — друг В;

— дружественность не наследуется: если А объявляет В другом наследники В не будут автоматически получать доступ к элементам А;

— дружественность не является переходным свойством: если А объявляет В другом, наследники А не будут автоматически признавать дружественность В.

16.3 Перегрузка операций

Перегрузка операций позволяет классу пользователя вести себя подобно встроенному типу данных. Только 4 операции не допускают перегрузку:

прямой выбор компоненты ( . ),

прямой доступ к компоненте ( .* ),

разрешение видимости ( :: ),

условная операция ( ? : ).

Перегрузка операций подчиняется следующим правилам:

1) приоритет и ассоциативность операций не меняются при перегрузке;

2) поведение операции не меняется по отношению к встроенным типам данных;

3) функция-операция должна быть либо элементом класса, либо принимать аргументы, имеющие тип класса;

4) функция-операция не может иметь аргументов по умолчанию;

5) за исключением присваивания, функции-операции не наследуются.

Имя функции-операции содержит ключевое слово operator, за которым следует знак операции.

Бинарная операция может быть определена как функция-член с одним параметром (правым операндом) или как глобальная функция с двумя параметрами (левым и правым операндами). Унарная операция может быть определена как функция-член без параметров или как глобальная функция с одним параметром.

Чтобы отличить постфиксную унарную операцию от префиксной, постфиксной функции-операции дают дополнительный фиктивный целый параметр.

Примеры перегрузки операций d++, ++d, d1==d2, d1!=d2.

class date {

public:

int d,m,y;

date(int ad,int am,int ay) {d=ad; m=am; y=ay;};

void operator++(); // префиксная

void operator++(int); // постфиксная

int operator!=(date d2)

{ return (d!=d2.d) ||(m!=d2.m); }

};

void date::operator++() // член класса

{

d++;

}

void date::operator++(int) // член класса

{

++(*this);

}

int operator==(date d1, date d2) // имеет класс аргументом

{

return (d1.d==d2.d)&&(d1.m==d2.m);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]