目录
指向数据成员的指针
● 在C++中, 我们可以定义一个指针, 使其指向类数据成员或类成员函数,然后通过指针来访问类的成员。
● 当数据成员为静态成员和非静态成员时, 指针的使用有所不同。 其中,指向非静态数据成员的指针定义如下:
数据类型 类名 ::*指针名 = &类名::非静态数据成员
指向非静态数据成员的指针在定义时必须和类相关联, 在使用时必须和具体的对象关联。
类对象名. *指向非静态数据成员的指针
● 指向静态数据成员的指针的定义和使用普通指针相同,再定义时无须和类相关联, 在使用时也无须和具体的对象相关联。
class A
{
public:
int get()
{
return nx;
}
void set(int x)
{
nx = x;
}
int nx;
static A *getInstance(); 得到类A的实例指针
static A *pA;
};
A *A::pA = nullptr;
A *A::getInstance()
{
if (pA != nullptr)
{
pA = new A;
}
return pA;
}
int main()
{
A *pa = A::pA; 指向静态数据成员pA的指针
int A::*px = &A::nx; 指向非静态数据成员nx的指针
pa = A::getInstance();
pa->*px = 100; 为指针的数据赋初值
cout << pa->get() << endl;
system("pause");
return 0;
}
指向成员函数的指针
● 定义一个指向非静态成员函数的指针必须要注意3个方面与其指向的成员函数保持一致, 即参数列表、返回类型、和所属的类要相同:
数据类型 类名::*指针名(参数列表) = & 类名:: 非静态成员函数
使用指向非静态成员函数的指针的方法和使用指向非静态数据成员的指针的方法相同:
类对象名. *指向非静态成员函数的指针(参数列表);
指向静态成员函数的指针和普通指针相同,在定义时无须和类相关联, 在使用时也无须和具体的对象相关联。
数据类型 *指针名(参数表) = &类名::静态成员函数
下面看代码示例:
class Time
{
public:
void display();
static Time getCurrentTime2();
protected:
unsigned short hour;
unsigned short minute;
unsigned short second;
};
void Time::display()
{
cout << hour << "时";
cout << minute << "分";
cout << second << "秒" << endl;
}
Time Time::getCurrentTime2()
{
Time tt;
tt.hour = 5;
tt.minute = 12;
tt.second = 2;
return tt;
}
int main()
{
Time(*pfnGetCurrentTime)() = &Time::getCurrentTime2; 指向静态函数
void (Time::*pfnDisplay)() = &Time::display; 指向非静态函数
Time t = pfnGetCurrentTime(); 得到当前时间
(t.*pfnDisplay)(); 显示当前时间
system("pause");
return 0;
}
从中可以看出, 指向非静态成员函数时,必须使用类名作区域符, 使用时则必须用类的实例作为区域符。
指向静态成员函数时,则不需要使用类名作区域符。