C++ 中指向类成员的指针
就像指向普通变量和函数的指针一样,我们可以有指向类成员函数和成员变量的指针。
让我们看看这是如何工作的。
定义类类型的指针
我们可以定义类类型的指针,它可以用来指向类对象。
class Simple
{
public:
int a;
};
int main()
{
Simple obj;
Simple* ptr; // Pointer of class type
ptr = &obj;
cout << obj.a;
cout << ptr->a; // Accessing member with pointer
}
这里你可以看到我们已经声明了一个指向类的对象的类类型的指针。我们可以使用带有箭头->
符号的指针名称来访问数据成员和成员函数。
指向类的数据成员的指针
我们可以使用指针来指向类的数据成员(成员变量)。
声明语法:
datatype class_name :: *pointer_name;
赋值语法:
pointer_name = &class_name :: datamember_name;
声明和赋值也可以在一个语句中完成。
datatype class_name::*pointer_name = &class_name::datamember_name ;
对对象使用指针
为了访问正常的数据成员,我们对对象使用点.
操作符和指向对象的->
指针。但是当我们有一个指向数据成员的指针时,我们必须去引用那个指针来得到它所指向的东西,因此它变成了,
Object.*pointerToMember
通过指向对象的指针,可以通过写入来访问它,
ObjectPointer->*pointerToMember
让我们举个例子,来理解完整的概念。
class Data
{
public:
int a;
void print()
{
cout << "a is "<< a;
}
};
int main()
{
Data d, *dp;
dp = &d; // pointer to object
int Data::*ptr=&Data::a; // pointer to data member 'a'
d.*ptr=10;
d.print();
dp->*ptr=20;
dp->print();
}
a 是 10 a 是 20
语法非常难,因此它们只在特殊情况下使用。
指向类成员函数的指针
指针可以用来指向类的成员函数。
语法:
return_type (class_name::*ptr_name) (argument_type) = &class_name::function_name;
下面是一个例子,展示我们如何使用 ppointer 来成员函数。
class Data
{
public:
int f(float)
{
return 1;
}
};
int (Data::*fp1) (float) = &Data::f; // Declaration and assignment
int (Data::*fp2) (float); // Only Declaration
int main(0
{
fp2 = &Data::f; // Assignment inside main()
}
需要记住的几点
您可以在运行时更改这些指针的值和行为。这意味着,您可以将其指向其他成员函数或成员变量。
要拥有指向数据成员和成员函数的指针,您需要将它们公开。