在非类型模板参数一文中,我们了解到类成员指针可以用作非类型参数使用,这一节我们一起简单了解以下成员指针。
1、成员变量指针
定义成员变量指针的语法如下:
类名::*指针名
举一个简单的例子,有类A,内部有一个int成员x:
class A {
public:
int x;
};
我们可以定义一个成员变量指针:
int A::*ptr = &A::x;
成员对象指针使用示例如下:
int main() {
int A::*ptr = &A::x;
A a;
a.*ptr = 10;
std::cout << a.x << std::endl;
}
如何理解上述例子呢?
表达式&A::x
是获取类A的成员变量x的地址,A::x
表示A的成员x,&
表示取地址。
在以往的学习中,我们通常用类名::成员名
来获取类的静态成员或者是静态方法,但是在这里作用域解析符后的成员可以是非静态的,这个用法是有条件的,必须加上&
。
获取了成员变量的地址,就需要有一个变量来接收这个地址,这个变量的类型是什么呢?
int A::*ptr
可以分成三部分来理解:
int
:成员变量是int类型;A::
:A类型中的成员;*ptr
:这是一个指针;
连起来理解:ptr是一个指向类A的int型成员变量的指针。
之后我们再要用到A类中的x成员,就可以用成员指针代替,使用方法是将成员对象解引用。
与普通指针不同的是,成员指针不能直接解引用,必须通过对象或者对象的引用/指针来解引用。例如,如果我们有一个A类型的对象a,可以用a.*p
或(pa->*p)
来访问或修改成员变量x的值。
2、成员函数指针
成员函数指针和成员变量指针类似,这里举一个简单的例子:
class A {
public:
void func(int x) { std::cout << "x = " << x << std::endl; }
};
int main() {
void (A::*pf)(int) = &A::func;
A a;
(a.*pf)(10);
}