Введение в программирование

       

Указатели на методы-члены класса и на функции


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

Объявление указателя на метод может иметь следующее формальное описание:

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

Инициализация указателя может иметь следующее формальное описание:

тип_метода имя_класса::*имя_метода_указателя (список параметров)= &имя_класса::имя_любого_метода; тип_функции (*имя_ функции_указателя) (список параметров)= &имя_функции;

Вызов метода, объявленного как указатель на метод, может быть выполнен следующим образом:

(имя_объекта->*имя_ метода_указателя) (список параметров); (*имя_ функции_указателя)(список параметров);

Для функций, но не для методов - членов класса, разрешена другая форма вызова метода:

имя_ функции_указателя(список параметров); (имя_ функции_указателя)(список параметров);

Объявление функции, имеющей в качестве параметра указатель на метод, может иметь следующее формальное описание:

тип_метода имя_метода (тип_метода_указателя (*имя_метода_указателя) (список параметров));

Вызов метода, использующего в качестве параметра указатель на метод, может иметь следующее формальное описание:

имя_метода(имя_объекта->*имя_метода_указателя); имя_функции(имя_функции_указателя);

Разрешается создавать массив указателей на функции.

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

Например:

class a1 { public: a1(void); ~a1(void); int Fx1(int i1); int Fx2(int i2); }; a1::a1(void){} a1::~a1(void){} int a1::Fx1(int i1){ return 1;} int a1::Fx2(int i2){ return 2;}

int (*Fy_pointer)(); // Объявление указателя на функцию int Fy (); int _main(int argc, char* argv[]) { a1* a1Object = new a1(); int (a1::*Fx_pointer)(int)=&a1::Fx2; // Объявление и инициализация указателя // на метод - член класса int i; i=(a1Object->*Fx_pointer)(1); // Вызов по указателю на метод std::cout<<i; int (*Fy_pointer)()=&Fy; // Объявление и инициализация указателя // на функцию std::cout<<(Fy_pointer)(); std::cout<<(*Fy_pointer)(); // Вызов по указателю на // функцию (две формы) return 0; } int Fy () {return 5;}



Содержание раздела