C++指针详解:函数、对象、this及类成员指向的完整指南

陆遥
陆遥
发布时间:2026-10-16| 7人浏览过
原创

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++指针进阶操作技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。