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

原文:https://www.studytonight.com/cpp/pointer-to-members.php

就像指向普通变量和函数的指针一样,我们可以有指向类成员函数和成员变量的指针。

让我们看看这是如何工作的。


定义类类型的指针

我们可以定义类类型的指针,它可以用来指向类对象。

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()
}

需要记住的几点

  1. 您可以在运行时更改这些指针的值和行为。这意味着,您可以将其指向其他成员函数或成员变量。

  2. 要拥有指向数据成员和成员函数的指针,您需要将它们公开。