Указатели на элементы классов — КиберПедия 

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Указатели на элементы классов

2020-06-04 153
Указатели на элементы классов 0.00 из 5.00 0 оценок
Заказать работу

К каждому элементу класса можно обратиться с помощью указателя. Для этого определены две операции «.» и «->». Первая используется для обычных экземпляров класса, а вторая используется с указателями. Соответственно, указатели на поля и методы класса определяются по-разному.

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

В целом, такие указатели можно сравнить с массивом, так как они, по большей степени, задают смещение. Конечный адрес памяти получается в результате сочетания указателя на определённый объект и указателя на метод.

Синтаксис объявления указателя имеет следующий вид:

тип_данных (идентификатор_класса:: *идентификатор_указателя)(параметры);

Здесь «тип_данных» - это тип возвращаемого методом значения.

В качестве примера можно создать указатель на метод getHealth () ранее определённого класса Player.

Пример 9. Создание указателя на метод. <…> float (Player:: *ptrGet)();

Такой указатель не идентифицирует какой-то определённый метод, а указывает на аналогичные методы с одинаковой сигнатурой. Его можно использовать в качестве параметра функции, что позволит передавать в функцию идентификатор метода.

Пример 10. Передача в функцию идентификатора метода. void func(float (Player:: *ptrGet)()){ (*this.*ptrGet)(); /*вызов функции с помощью операции «.»*/ (this->*ptrGet)(); /*вызов функции с помощью операции «»->*/ }

Также указатели могут быть настроены на конкретные методы с помощью операции «&».

Пример 11. Передача в функцию идентификатора метода. //Присваивание значения указателю ptrGetH = &Player::getHealth(); Player myHero.*ptr; ptr = new Player; //Вызов функции операцией «.» float myHealth = (myHero.ptrGetH)(); //Вызов функции операцией «->» float getHealth = (ptr->*ptrGetH)();

Существует несколько правил по использованию указателей:

    1. Указателю на метод можно присваивать только адреса методов, имеющих соответствующий заголовок.
    2. Нельзя определить указатель на статический метод класса.
    3. Нельзя преобразовать указатель на метод в указатель на обычную функцию, не являющуюся элементом класса.

Указатели на поля классов не являются обычными указателями — ведь при присваивании им значений они не ссылаются на конкретный адрес памяти, поскольку память выделяется не под классы, а под экземпляры классов.

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

тип_данных (идентификатор_класса:: *идентификатор_указателя);

В определение указателя всегда можно включить его инициализацию. Формат инициализации, совмещённой с определением имеет следующий вид:

&идентификатор_класса:: идентификатор_поля;

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

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

Если в своей программе Вы описываете статические поля или методы, то они будут существовать для всех экземпляров класса при этом не повторяясь. То есть они хранятся в единственном экземпляре для всех объектов.

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

Пример 12. Статические поля. class Numeric{ public: static float num; }; float Numeric:: num; /*определение в глобальной области по умолчанию инициализируются 0*/ float Numeric:: num = 70.953; /*инициализация произвольным значением*/

Также обратиться к статическому полю можно и через экземпляры класса:

Пример 13. Статические поля. class Numeric{ public: static float num; }; float Numeric fNum, *ptrNum; <…> fNum.num = 3.1416; ptrNum->num = 16;

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

Статические методы

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

Обращение к таким методам не отличается от способов обращения к статическим полям. Т.е. либо с использованием идентификатора класса и оператора «::», либо с использованием идентификатора экземпляра этого класса.

Пример 14. Статические методы. <…> class Numeric{ private: static float num; public: static float getNum(){ return num; } static void setNum(float sNum){ num = sNum; } }; <…> int main(){ Numeric myNum; myNum.setNum(16); cout << myNum.getNum(); return 0; }

Поделиться с друзьями:

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

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

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.009 с.