C++ 类成员指针



指向 C++ 中类成员的指针

就像指向普通变量和函数的指针一样,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() 函数中赋值
}


需要记住的几点

  1. 你可以在运行时更改这些指针的值,因此,你可以将其指向其他成员函数或成员变量。
  2. 如果要使用指向数据成员和成员函数的指针,你需要将它们设为public。