1. 对象指针的基本概念与使用场景
在C++编程中,指针始终是一个既强大又危险的工具。当我们开始处理对象指针时,这种双重特性表现得尤为明显。对象指针不仅继承了普通指针的所有特性,还引入了面向对象编程特有的复杂性和灵活性。
1.1 为什么需要对象指针
对象指针在C++中扮演着关键角色,主要解决以下几个核心问题:
- 动态对象创建:通过new运算符在堆上分配对象,生命周期由程序员显式控制
- 多态实现:基类指针可以指向派生类对象,实现运行时多态
- 大对象传递:避免大对象在函数调用时的复制开销
- 对象共享:多个指针可以指向同一个对象,实现资源共享
cpp复制class MyClass {
public:
void show() { cout << "MyClass object" << endl; }
};
int main() {
MyClass obj; // 栈上对象
MyClass* pObj = &obj; // 指向栈对象的指针
pObj->show(); // 通过指针访问成员
MyClass* pHeapObj = new MyClass(); // 堆上对象
pHeapObj->show();
delete pHeapObj; // 必须手动释放
return 0;
}
1.2 对象指针与普通指针的区别
虽然对象指针本质上仍然是内存地址,但与普通指针相比有几个重要差异:
- 成员访问语法:使用->运算符而非*和.的组合
- 多态行为:通过虚函数实现运行时绑定
- 构造/析构:new会调用构造函数,delete会调用析构函数
- 类型系统:严格的类型检查,特别是涉及继承关系时
关键提示:使用对象指针时,必须时刻注意对象的生命周期。指向已销毁对象的指针(悬垂指针)是常见错误来源。
2. 对象指针的核心操作与语法细节
2.1 对象指针的声明与初始化
对象指针的声明遵循C++标准类型声明语法,但有一些特殊注意事项:
cpp复制// 基本声明方式
ClassName* ptr; // 声明但未初始化(危险!)
ClassName* ptr = nullptr; // 安全声明
// 初始化方式
ClassName obj;
ClassName* p1 = &obj; // 指向现有对象
ClassName* p2 = new ClassName(); // 动态分配
ClassName* p3 = new ClassName; // 同上,省略括号
// 数组对象
ClassName* arr = new ClassName[10]; // 对象数组
2.2 通过指针访问对象成员
通过对象指针访问成员需要使用->运算符,这是专为指针设计的语法糖:
cpp复制class Student {
public:
string name;
void print() { cout << name << endl; }
};
int main() {
Student* s = new Student();
s->name = "Alice"; // 访问数据成员
s->print(); // 调用成员函数
