指针与引用
智能指针
- 智能指针分类: std::unique_ptr, std::shared_ptr, std::weak_ptr.使用它们需要包含头文件
- C++11 新增了 std::make_shared() 方法创建一个 std::shared_ptr 对象,却没有提供相应的 std::make_unique() 方法创建一个 std::unique_ptr 对象,这个方法直到 C++14 才被添加进来.
- std::unique_ptr 是独占所有权的智能指针, 确保同一时间只能有一个 unique_ptr指向对象. 不能进行拷贝操作,但是可以通过移动操作将所有权转移给其它指针.
- std::shared_ptr 允许多个指针共享同一个对象的所有权,通过引用计数来管理共享资源,当最后一个指向该对象的指针被销毁时,对象会被自动释放.
- std::weak_ptr 是一种弱引用的智能指针, 不拥有对象的所有权, 不会影响对象的生命周期,通常用于解决循环引用问题.配合 std::shared_ptr 的使用,解决循环引用的问题.
- std::auto_ptr 是C++98标准引入的智能指针, 也实现了对对象的独占所有权, 但在复制操作时会移动资源.在C++11中被废弃.
指针与引用的区别
| 特性 | 指针 | 引用 |
|---|---|---|
| 声明 | int* p; |
int& ref = a; |
| 初始化 | 可不初始化,默认为野指针 | 必须初始化 |
| 使用时访问变量值 | 需要解引用 *p |
直接使用 ref |
| 重新赋值 | 指针可以指向不同地址 | 引用一旦绑定不可更改 |
| 空指针 | 可以指向空(nullptr) |
引用不能为“空”,必须绑定有效对象 |
- 指针 指针是一个变量,存储的是另一个变量的内存地址。指针可以指向任何数据类型,包括基本类型、对象、函数等。实质是存储地址的变量,占用内存空间(通常是4或8字节,依赖于系统架构)。
- 引用 引用是某个变量的别名,是已存在变量的一个别称。引用必须在定义时初始化,且一旦绑定到某个变量,就不能再绑定到其它变量。引用通常被实现为指针的常量别名,编译器在生成代码时会优化为直接访问目标变量,引用本身不占用额外空间。
指针与引用代码示例
#include <iostream>
void incrementPointer(int* p) {
if (p) {
(*p)++;
}
}
void incrementReference(int& r) {
r++;
}
int main() {
int a = 5;
incrementPointer(&a);
std::cout << "After incrementPointer: " << a << std::endl; // 输出6
incrementReference(a);
std::cout << "After incrementReference: " << a << std::endl; // 输出7
return 0;
}