C++指针详解:函数、对象、this及类成员指向的完整指南
C++中的指针是内存管理的基石,除了常见的变量指针,还涉及函数地址、对象实例以及类内部成员的引用。本文详细解析函数指针、对象指针、this指针,以及指向类静态和非静态成员的指针的定义、赋值、访问权限控制及实际调用方法。
1、函数指针的原理与应用
在C++中,函数名本质上就是该函数代码在内存中的首地址。因此,可以定义一种指向函数的指针,即函数指针。其核心作用是让代码可以通过统一接口动态调用不同的函数实现。
第1步:声明函数指针
函数指针的定义需严格匹配目标函数的返回类型和参数列表。语法结构如下:
// 语法格式:数据类型 (*指针名)(参数表);
// 例如:定义一个接收int并返回int的函数指针
int (*funcPtr)(int);
第2步:赋值与调用
将具体函数的地址赋值给指针后,即可像调用普通函数一样使用指针。需注意指针类型必须与目标函数完全一致。
// 定义一个基础函数
int addOne(int x) {
return x + 1;
}
// 1. 声明指针
int (*pointerAddOne)(int x);
// 2. 赋值(函数名即为地址)
pointerAddOne = addOne;
// 3. 调用
int result = pointerAddOne(5); // 结果为6
2、对象指针的操作规范
对象指针是指向类实例的指针。与基本类型变量类似,可以将对象的地址赋给同类型的指针,从而间接操作对象。
第1步:定义对象与指针
首先确保已定义好类实例,随后声明对应的指针变量。
Duck duck(666); // 创建对象
Duck *ptrToDuck; // 声明对象指针
第2步:指针赋值与成员访问
通过取地址符 & 获取对象地址。访问对象成员有两种等效语法:(*ptr).成员 或 ptr->成员,推荐使用箭头运算符以增强可读性。
ptrToDuck = &duck; // 绑定对象地址
// 两种方式输出结果相同
printf("%d\n", (*ptrToDuck).getAge());
printf("%d\n", ptrToDuck->getAge());
3、This指针的本质解析
this指针是C++类的非静态成员函数隐含的一个参数。它始终指向当前正在调用该成员函数的对象实例。当多个对象调用同一个成员函数时,this 指针确保了每个对象都能正确操作属于自己的数据成员。
第1步:解决命名冲突
当局部变量与数据成员同名时,直接使用变量名会指代局部变量。此时必须显式使用 this->成员名 来区分。
第2步:代码示例
class Duck{
public:
Duck(int age) { duckAge = age; };
int getAge() {
int duckAge = 999; // 局部变量屏蔽了成员变量
// 直接返回 duckAge 会是999
// 使用 this->duckAge 返回的是构造时传入的年龄
return this->duckAge;
}
private:
int duckAge;
};
4、指向类非静态成员的指针
非静态成员属于具体的对象,而非整个类。因此,指向它们的指针需要携带额外的信息(如偏移量),并在访问时必须绑定到一个具体的对象上。
第1步:声明特殊类型的指针
声明此类指针时,必须在类型前加上 类名::* 限定符,表明该指针指向的是特定类的成员。
// 指向数据成员
int Duck::*ptrWeight;
// 指向成员函数(带参数表)
int (Duck::*ptrGetAgeFunc)();
第2步:赋值操作
使用取地址符配合作用域解析运算符进行赋值,注意不需要指定具体对象,只需指定类内成员名称。
ptrWeight = &Duck::duckWeight;
ptrGetAgeFunc = &Duck::getAge;
第3步:通过对象解引用
由于成员函数共享代码,但操作的数据各异,调用时需结合具体对象实例。
Duck duck(100);
// 访问数据成员语法:object.*ptr 或 objectPtr->*ptr
printf("%d\n", duck.*ptrWeight);
// 调用成员函数语法:(object.*ptrFunc)(args)
printf("%d\n", (duck.*ptrGetAgeFunc)());
5、指向类静态成员的指针
静态成员(static)属于类本身而不属于特定对象,它们在内存中只有一份副本。因此,可以使用常规的普通指针指向静态成员,无需复杂的类限定符。
第1步:常规指针声明
直接声明标准数据或函数指针即可。
class Duck{
public:
static int getAge() { return 666; }
static int duckWeight;
};
int Duck::duckWeight = 333; // 静态成员需在类外初始化
int *ptrStaticWeight; // 普通指针
int (*ptrStaticFunc)(); // 普通函数指针
第2步:赋值与调用
赋值时使用 &类名::成员名,使用时遵循普通指针的规则。
ptrStaticWeight = &Duck::duckWeight;
ptrStaticFunc = &Duck::getAge;
// 解引用指针获取值
printf("%d\n", *ptrStaticWeight);
// 调用静态函数
printf("%d\n", (*ptrStaticFunc)());
以上就是C++函数指针、对象指针、this指针及类成员指针的详细内容,更多关于C++指针进阶操作技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













