Справочник по C/C++
Операторы указания на члены .* и ->*

Язык C++ позваляет генерировать специальный тип указателя, который отсылает не к конкретному экземпляру этого члена в объекте, а к члену классы вобще. Данный вид указателя называеться указателем на член. Указатель на член — это совсем не тоже самое, что обычный указатель, поддерживаемый в языке C++. Указатель на член представляет всего лиш смещение в объекте класса, которому этот член может принадлежать. Поскольну указатели на члены не являються настоящими указателями, к ним нельзя применять операторы . и ->. Для получения доступа к члену класса, заданого указателем, необходимо использовать специальные операторы указания на члены .* и ->*.

При доступе к члену объекта, заданного самим объектом или ссылкой на него, используеться оператор .*. При доступе к члену, заданному указателем на объект, используеться оператор ->*.

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

тип имя_класса::*ptr;
Здесь тип представляет собой базовый тип члена, имя_класса задаёт имя класса, а ptr — это имя создоваемой переменной указателя на член. После создания элемент ptr можетотсылать к любому члену класса, который имеет тип, заданый элементом тип.

Ниже приведён короткий пример, демонстрирующий использование оператора .*. Обратите внимание на способ указывания на члены.

#include <iostream.h>
class cl {
	public:
		cl (int i){ val = i; }
		int val;
		int double_val(){ return val + val; }
};
int main()
{
	int cl::*data;		//указатель на член с именем data типа int
	int (cl::*func)()	//указатель на член с именем func
	cl ob1(1), ob2(2);	//зоздаём объекты
	
	data = &cl::val;	//получаем смещение
	func = &cl::double_val;	//получаем смещение
	
	cout << "Вот исходные значения ";
	cout << ob1.*data << " " << ob2.*data << "\n";
	
	cout << "А теперь они удвоены ";
	cout << (ob1.*func)() << " ";
	cout << (ob2.*func)() << "\n";

	return 0;
}



Реклама