指向类数据成员的指针

在C++中,可以定义一个指针,使其指向类成员或成员函数,然后通过指针
来访问类的成员。这包括指向属性成员的指针和指向成员函数的指针。它类似与static成员函数或成员变量,具有共享的属性。每一个实例化的对象都可以借助指向类数据成员的指针来访问指向的数据。它的结构图如下:

2015-05-15_001400

简单的代码实现:

#include <iostream>
#include <string>
 
using namespace std;
 
class Student
{
public:
	Student(string n, int nu)
		:name(n), num(nu){}
	string name;
	int num;
};
 
int main(int argc, char* argv[])
{
	Student s1("zhangsan", 1002);
	Student s2("lisi", 1001);
	Student *ps3 = new Student("liuneng", 1003);
 
	// 一旦类成员是私有数据则不能正常访问了
	// string *ps = &s1.name;
	// cout << *ps << endl;
 
	// 定义一个类中name成员的指针(记录name成员的偏移量)
	// 与实例化的对象无关,但实例化的对象可以使用该指针访问数据成员
	string (Student::*ps) = &Student::name;
 
	// 访问s1对象中ps指针偏移的位置记录的内容
	// 前提是数据成员都是public属性
	cout << s1.*ps << endl;
	cout << ps3->*ps << endl;
 
	getchar();
	return 0;

}

这种情况下只能操作共有成员,一旦数据成员是私有的则无法正常操作了。

所以我们还是一样要通过成员函数来操作,同样,成员函数一样可以拥有一个属于自己的指针。

#include <iostream>
#include <string>
 
using namespace std;
 
class Student
{
public:
	Student(string n, int nu)
		:name(n), num(nu){}
	void display()
	{
		cout << "name:" << name << endl << "num:" << num << endl;
	}
private:
	string name;
	int num;
};
 
int main(int argc, char* argv[])
{
	Student s1("zhangsan", 1002);
	Student *ps3 = new Student("liuneng", 1003);
 
	// 一个指向类成员函数的指针
	void (Student::*pf)() = &Student::display;
 
	// 实例化的对象使用该指针访问成员函数display
	(s1.*pf)();
	(ps3->*pf)();
 
	getchar();
	return 0;
}

以上均是指向非静态成员的类成员指针,而指向静态类成员的指针则非常简单。

●指向类静态成员函数的指针
指向静态成员函数的指针和普通指针相同,在定义时无须和类相关联,在使用时也
无须和具体的对象相关联。

#include <iostream>
#include <string>
 
using namespace std;
 
class Student
{
public:
	static void display();
	static int data;
};
 
void Student::display()
{
	cout << data << endl;
}
 
int Student::data = 100;
 
int main()
{
	// 指向类静态数据成员变量的指针
	int *p = & Student::data;
	cout<<*p<<endl;
 
	// 指向类静态数据成员函数的指针
	void (*pfunc)() = Student::display;
	pfunc();
 
	getchar();
	return 0;
}

 

评论