C++编程:掌握指向成员的指针与成员函数指针用法

需积分: 3 0 下载量 187 浏览量 更新于2024-07-24 收藏 819KB PDF 举报
"深入理解C++中的指向成员的指针" 在C++中,掌握如何使用指向成员的指针是提高编程技巧的关键。这包括指向数据成员的指针和指向成员函数的指针,它们允许我们以更灵活的方式访问和操作对象的内部结构。 1. 指向数据成员的指针 在C++中,可以声明一个指针变量来指向类的特定数据成员。声明这样的指针需要使用`类型说明符 类名::* 指针名`的语法。例如: ```cpp int Point::*myptr; // 声明一个指向Point类的int类型数据成员的指针 ``` 赋值时,我们需要使用类名和作用的数据成员,如: ```cpp myptr = &Point::x; // 假设Point有一个名为x的int类型数据成员 ``` 访问数据成员时,可以使用`.`或`->`操作符,取决于我们是否已经有一个对象实例。如果对象名为`obj`,则访问方式为`obj.*myptr`;如果`myptr`指向的是对象指针`obj_ptr`所指的对象,则访问方式为`obj_ptr->*myptr`。 2. 指向成员函数的指针 C++也支持指向成员函数的指针,这对于回调函数或事件处理非常有用。声明一个指向成员函数的指针的语法如下: ```cpp 返回类型 (类名::*指针名)(参数列表); ``` 例如,如果我们有一个名为`time::get_time`的无参成员函数,可以这样声明: ```cpp void (time::*p2)() = &time::get_time; // 声明并赋值 ``` 调用成员函数时,需要通过对象实例来完成,因为成员函数与对象紧密相关。例如: ```cpp (t1.*p2)(); ``` 或者,如果`p2`是指向`t1`的指针,可以写为: ```cpp (t1->*p2)(); ``` 请注意,成员函数指针的声明、赋值和使用时的返回值类型以及参数列表必须完全匹配,否则会导致编译错误。 在给出的示例代码中,可以看到这些概念的实际应用: - `int(point::*p_getx)() = &point::getx;` 是声明并赋值一个指向成员函数`getx`的指针。 - `(A.*p_getx)()` 使用该指针调用`point`对象`A`的`getx`方法。 - `(p1->getx)()` 直接调用`point`指针`p1`所指向的对象的`getx`方法。 - `int time::*p6 = &time::hour;` 是声明一个指向`time`类的`int`类型数据成员`hour`的指针。 - `t1.*p6` 和 `p2->*p6` 分别通过对象实例和指针调用`hour`成员。 通过理解和熟练运用这些概念,C++程序员可以创建更加复杂和高效的设计,比如在模板元编程、回调机制和面向切面编程中。