一、概述
C++ 对象指针是指向类的对象的指针。它的作用和其他类型的指针相同,可以用来间接地访问和操作对象的成员。使用对象指针可以在动态内存分配、函数参数传递、返回对象等情况下提高灵活性和效率。
二、对象指针的定义与使用
声明对象指针的形式
类名*对象指针名;
定义使用步骤
- 定义对象指针:对象指针的定义方式与其他类型的指针类似,只是指针指向的是一个对象。
- 动态分配对象:可以使用
new
操作符在堆上动态分配对象,并返回指向该对象的指针。 - 访问对象成员:可以使用箭头运算符
->
通过对象指针访问对象的成员函数和成员变量。
定义使用示例代码
#include <iostream>
#include <string>
class Person {
private:
std::string name;
int age;
public:
// 构造函数
Person(std::string newName, int newAge) : name(newName), age(newAge) {
std::cout << "Constructor called for " << name << std::endl;
}
// 析构函数
~Person() {
std::cout << "Destructor called for " << name << std::endl;
}
// 打印个人信息的成员函数
void printInfo() const {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
int main() {
// 动态分配一个 Person 对象,并用对象指针指向它
Person* personPtr = new Person("Alice", 30);
// 通过对象指针访问成员函数
personPtr->printInfo(); // 输出:Name: Alice, Age: 30
// 释放动态分配的内存
delete personPtr;
return 0;
}
三、步骤详解
定义对象指针
Person* personPtr;
这里,personPtr
是一个指向 Person
对象的指针。
动态分配对象:
personPtr = new Person("Alice", 30);
使用 new
操作符在堆上动态分配一个 Person
对象,并将其地址赋值给 personPtr
。new
操作符会调用 Person
类的构造函数来初始化对象。
访问对象成员:
personPtr->printInfo();
使用箭头运算符 ->
通过指针调用对象的成员函数 printInfo()
。
释放动态分配的内存:
delete personPtr;
使用 delete
操作符释放动态分配的内存,避免内存泄漏。delete
操作符会调用对象的析构函数。
四、注意事项
- 内存管理:动态分配的内存必须显式释放,使用
delete
操作符避免内存泄漏。 - 指针的安全性:确保指针在使用前已经初始化,并在释放内存后将指针设为
nullptr
以避免悬空指针。
设置nullptr示例代码
#include <iostream>
#include <string>
class Person {
private:
std::string name;
int age;
public:
// 构造函数
Person(std::string newName, int newAge) : name(newName), age(newAge) {
std::cout << "Constructor called for " << name << std::endl;
}
// 析构函数
~Person() {
std::cout << "Destructor called for " << name << std::endl;
}
// 打印个人信息的成员函数
void printInfo() const {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
int main() {
// 动态分配一个 Person 对象,并用对象指针指向它
Person* personPtr = new Person("Alice", 30);
// 通过对象指针访问成员函数
personPtr->printInfo(); // 输出:Name: Alice, Age: 30
// 释放动态分配的内存
delete personPtr;
// 将指针设为 nullptr 以避免悬空指针
personPtr = nullptr;
// 尝试再次访问指针,检查是否为 nullptr
if (personPtr == nullptr) {
std::cout << "personPtr is now nullptr." << std::endl;
}
return 0;
}
在 C++ 中,当你使用 delete
操作符释放动态分配的内存时,指针本身不会自动设置为 nullptr
。如果你不手动将指针设置为 nullptr
,该指针将成为悬空指针(dangling pointer),指向一块已经被释放的内存区域。访问悬空指针会导致未定义行为。