指向类的指针和指向类成员的指针的区别
时间: 2024-09-10 12:28:08 浏览: 17
指向类的指针是指向整个对象的指针,通常用来访问对象的成员变量和成员函数。在C++中,这种指针有时也被称为对象指针。指向类成员的指针则是指向类内特定成员(无论是属性还是方法)的指针,它需要一个实例来指定要访问的具体对象成员。
简单来说,类指针直接关联到整个类的实例,而类成员指针则是类实例的某个具体成员的间接访问方式。举个例子:
```cpp
class MyClass {
public:
int data;
void function() {}
};
MyClass obj;
MyClass* classPtr = &obj; // 指向类的指针,指向obj对象
int MyClass::*memberPtr = &MyClass::data; // 指向类成员的指针,指向MyClass类的data成员
(*classPtr).data; // 通过类指针访问成员变量
classPtr->data; // 同上,更常用的方式
(obj.*memberPtr); // 通过类成员指针访问obj对象的data成员
(obj.*memberPtr) = 10; // 设置obj对象的data成员值为10
```
这里有几个重点:
1. 指向类的指针可以使用箭头操作符(->)或者通过解引用操作符(*)后使用点操作符(.)来访问对象的成员。
2. 指向类成员的指针则需要使用对象的实例和特殊的访问操作符(.*和->*)来访问类的成员。
相关问题
指向类成员函数的指针
类成员函数指针是一种用于存储指向类成员函数的地址的指针。通过类成员函数指针,我们可以在不创建类对象的情况下调用类的成员函数。
使用类成员函数指针时,需要注意以下几点:
1. 函数指针赋值要使用 & 符号。
2. 使用 .* (实例对象)或者 ->*(实例对象指针)调用类成员函数指针所指向的函数。
下面是一个例子,演示了如何定义和使用类成员函数指针:
```cpp
#include <iostream>
class MyClass {
public:
void myFunc(int num) {
std::cout << "MyClass::myFunc() called with number: " << num << std::endl;
}
};
int main() {
MyClass obj;
void (MyClass::*funcPtr)(int) = &MyClass::myFunc; // 定义类成员函数指针
(obj.*funcPtr)(42); // 使用指针调用类成员函数,输出: MyClass::myFunc() called with number: 42
return 0;
}
```
函数指针指向类成员函数
函数指针可以指向类的静态成员函数,但是不能直接指向类的非静态成员函数。这是因为非静态成员函数包含了一个隐含的 this 指针,用于指向调用该函数的对象。因此,要想通过函数指针调用非静态成员函数,需要借助于一些技巧。
一种常见的做法是使用成员函数指针。成员函数指针与普通的函数指针不同,它需要指定类类型和成员函数的参数列表。具体的用法如下:
```cpp
class MyClass {
public:
void myFunction(int arg) {
// 执行一些操作
}
};
int main() {
void (MyClass::*funcPtr)(int) = &MyClass::myFunction; // 定义并初始化成员函数指针
MyClass obj;
(obj.*funcPtr)(42); // 通过对象和成员函数指针调用成员函数
return 0;
}
```
在上面的例子中,`funcPtr` 是一个指向 MyClass 类的非静态成员函数的指针。通过使用 `obj.*funcPtr` 的语法,我们可以调用这个指针所指向的成员函数。