就像指向普通变量和函数的指针一样,C++中也有指向类成员函数和成员变量的指针。
让我们看看它是如何工作的。
我们可以定义类的指针,用来指向类对象。
class Simple
{
public:
int a;
};
int main()
{
Simple obj;
Simple* ptr; // 类指针
ptr = &obj;
cout << obj.a;
cout << ptr->a; // 用指针访问变量a
}
在这里你可以看到我们已经声明了一个指向类对象的指针ptr,我们可以使用带有箭头 ->
符号的指针来访问数据成员和成员函数。
我们可以使用指针来指向类的数据成员(成员变量)。 声明语法:
数据类型 类名 :: *指针名;
指针名 = &类名 :: 成员数据;
数据类型 类名::*指针名 = &类名::成员数据 ;
为了访问普通数据成员,我们使用“对象名+.
运算符”或者“指针+->
” ,但是当我们有一个指向数据成员的指针时,我们必须使用*以获取它所指向的内容,因此它变成了:
Object.*pointerToMember
如果使用指向对象的指针,可以通过这样来访问它:
ObjectPointer->*pointerToMember
这样说的有些难以理解,让我们举个例子
class Data
{
public:
int a;
void print()
{
cout << "a is "<< a;
}
};
int main()
{
Data d, *dp;
dp = &d; // 指向对象的指针
int Data::*ptr=&Data::a; // 指向数据成员'a'
d.*ptr=10;
d.print();
dp->*ptr=20;
dp->print();
}
以上实例输出结果:
a is 10 a is 20
这种语法非常严格,因此在实际中我们一般不这样用,仅在特殊情况下使用。
指针可用于指向类的成员函数。 语法:
return_type (class_name::*ptr_name) (argument_type) = &class_name::function_name;
下面是一个例子来展示我们如何使用指向成员函数的指针。
class Data
{
public:
int f(float)
{
return 1;
}
};
int (Data::*fp1) (float) = &Data::f; // 声明并赋值
int (Data::*fp2) (float); // 仅声明
int main(0
{
fp2 = &Data::f; // 在main() 函数中赋值
}