Указатели на члены класса
Кроме указателей на объекты класса, в С++ существуют указатели на от дельные члены класса. Указатель на отдельный член существенно отличается от обычного указателя, как по способу объявления, так и по методам использования. Указатель на член класса задает смещение этого члена. В некотором смысле это относительный адрес члена класса в структуре класса. Указатели на члены класса могут ссылаться как на поля, так и на методы. Объявление указателей на поля и на методы выполняется по-разному. При объявлении указателя на поле класса указывается тип для указателя, со впадающий с типом поля, на которое ссылается указатель, а перед именем указателя, кроме обычного в таких случаях оператора *, через опера тор расширения контекста ::, указывается и имя класса.
#includeusing namespace std; //Объявление класса: class MyClass{ public: int m; double n; MyClass(int x,double y){ m=x; n=y;} void show(bool arg){ if(arg) cout << "m = " << m << endl; else cout << "n = " << n << endl;} }a(1,2.5),b(3,4.8); int main(){ //Объявление указателя на поле класса: int MyClass::*p; //Объявление обычного указателя: double *q; //Объявление указателя на объект: MyClass *op; //Объявление указателя на метод класса: void (MyClass::*s)(bool arg); //Указателю на поле класса присваивается значение: p=&MyClass::m; //Обычному указателю присваивается адрес поля объекта: q=&a.n; //Присваивается значение указателю на метод класса: s=&MyClass::show; //Присваивается значение указателю на объект: op=&b; //Обращение к полю объекта через указатель на поле класса: cout << "a.m: " << a.*p << endl; //Обращение к полю объекта через указатель на поле класса // и указатель на объект: cout << "b.m: "< *p << endl; //Обращение к полю объекта через обычный указатель: cout << "a.n: " << *q << endl; cout << "a.show():\n"; //Вызов метода объекта через указатель на метод класса: (a.*s)(true); cout << "b.show():\n"; //Вызов метода объекта через указатель на метод класса // и указатель на объект: (op -> *s)(false); return 0; }