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

Константные объекты и константные

Любой объект пользовательского типа может быть объявлен как константа.

const Point2d d(5,4);

double mod() const

{

return sqrt(x*x+y*y);

}

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

const имя_класса const *this;

Всвязи с такой трактовкой, в классе может существовать два одноименных метода, отличающиеся наличием или отсутствием const. Для константных объектов будет вызываться только константный метод, а для неконстантных – неконстантный. При существовании одного лишь константного метода, он будет вызываться для всех объектов, т.к. преобразование неконстанного объекта в константный – безопасно.

Указатели на член-классы

int a;

int *pa;

pa=&a;

*pa=10;//разадресация

//указатели на функции

void f();

void(*pf)();

pf=f;//настройка указателя на конкретную функцию.

(*pf)();//обращение к функции f

pf();//компактное обращение

class Point2D

{

public:

double x,y;

double mod() const;

};

Point2D a(3,5);

double *pd;

pd=&a.x;

*pd=10;

pd=a.y;

*pd=15;

double (*pf)();

pf=a.mod();//ошибка

Ошибка возникает потому, что сигнатура у член-функции и обычных функций отличается. У член-функций есть еще один неявный аргумент. Использование указателей в вышеприведенном стиле допустимы только для статических функций. Всвязи с этим, в С++ было введено специальное средство для написания указателей без привязки к объекту.

double Point2D::*pd;

double (Point2D::*pf)()const;

Настройка этих указателей проводится без указания конкретного объекта и даже при отсутствии класса элемента.

pd=&Point2d::x;//настройка указателя на данные класса

pf=&Point2D::mod;//

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

Данные операции служат для разыменовывания указателя на член класса: .* и ->*

Point2D a(2,3), *pa=&a;

Point2D b(3,4), *pb=&b;

a.*pd=10;//a.x=10

pa->*pb=10;

b.*pb=10;

pb->*b=12;//pb->x=12

cout<<(a.*pf)();

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

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