Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400107.doc
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
568.32 Кб
Скачать
      1. Статические члены классов

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

Пример:

class X

{

int k;

public:

static void func (int i, X *ptr);

};

main ()

{

X obj, *obj1=&obj; ……..

X::func(1, &obj); //только для статических функций

obj.func(2, &obj); //для любых функций

obj->func(3,obj1); //для любых функций

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

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

operator@(a1[,a2]),

где: operator ключевое слово;

@ знак переопределяемой операции;

a1,a2 аргументы операции, их количество должно

соответствовать количеству операндов

переопределяемой операции

Пример. Введем опреации + и * для комплексных чисел.

class complex

{

double real_part, imag_part;

public:

Complex (double r, double i)

{ real_part=r;

imag_part=i; }

friend complex operator+ (complex, complex);

friend complex operator* (complex, complex);

…….. };

Операции + (двуместная) и * получат новый смысл для данных типа complex, сохраняя обычный смысл для других типов данных. Тексты функций перегрузки:

complex operator+(complex a1, complex a2)

{

return complex (a1.real_part + a2.real_part,

a1.imag_part + a2.imag_part); }

complex operator*(complex a1, complex a2) {return ((a1.real_part * a2.real_part) –

(a1.imag_part * a2.imag_part), (a1.rael_part * a2imag_part) + (a1.imag_part *

a2.real_part));

}

После такой перегрузки допустимо определение функции:

void evalute ()

{

complex a=complex (1,3.1);

complex b (1.2,2); //допустимы обе записи

complex c=b; //конструктор не запускается

c=a+b; b=b+c*a; c=a*b+complex(1,2);

}

Следующая запись ошибочна!

complex a (1,3.1); //правильно

complex b=a+2; //ошибка, автоматическое преобразование типа не выполняется

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

class complex

{

double real_part, imag_part;

public:

complex (double r, double i)

{real_part=r; imag_part=i;}

complex (double r)

{real_part=r; imag_part=0;}

complex()

{real_part=0; imag_part=0;}

};

После такого объявления класса допустимо:

complex a=complex (1.0,3.1);

complex b=a+complex(2);

Приведем в конце параграфа сводку правил перегрузки операций:

нельзя менять приоритет операций;

нельзя переопределять операции . :: .* ?: ;

переопределяемая операция должна существовать в языке С.