文章目录
- **C++ 各类传参的书写格式总结**
- **1. 基本数据类型**
- **2. 数组**
- **3. STL 容器(vector, list, map, etc.)**
- **4. 类对象**
- **C++ 二维数组的传参方式对比**
- **5. 指针与引用的综合**
- **🌟 总结**
C++ 各类传参的书写格式总结
1. 基本数据类型
方式 | 书写格式 | 说明 |
---|
按值传递 | void func(int a); | 传递副本,不影响原数据 |
按指针传递 | void func(int* a); | 传递地址,可修改原数据,需检查 nullptr |
按引用传递 | void func(int& a); | 传递别名,直接修改原数据 |
按常量引用传递 | void func(const int& a); | 传递别名,保护数据不被修改 |
2. 数组
方式 | 书写格式 | 说明 |
---|
按指针传递 | void func(int* arr, int size); | 传递指针,需额外传递大小 |
按引用传递 | void func(int (&arr)[5]); | 传递数组的引用,大小必须固定 |
std::array 传递 | void func(const std::array<int, 5>& arr); | 避免退化,更安全 |
3. STL 容器(vector, list, map, etc.)
方式 | 书写格式 | 说明 |
---|
按指针传递 | void func(std::vector<int>* v); | 允许 nullptr ,需使用 -> 访问 |
按引用传递 | void func(std::vector<int>& v); | 避免拷贝,提高效率 |
按常量引用传递 | void func(const std::vector<int>& v); | 保护数据,避免不必要的拷贝 |
4. 类对象
方式 | 书写格式 | 说明 |
---|
按值传递 | void func(Person p); | 产生拷贝,适用于小对象 |
按指针传递 | void func(Person* p); | 允许 nullptr ,需检查 |
按引用传递 | void func(Person& p); | 避免拷贝,直接操作对象 |
按常量引用传递 | void func(const Person& p); | 避免拷贝,保护数据不被修改 |
C++ 二维数组的传参方式对比
都是 两行三列 二维数组
C/C++ 中的二维数组(如 int arr[2][3]
)本质上是 按行优先顺序连续存储的一维数组:
int arr[2][3] = {{1,2,3}, {4,5,6}};//地址低 → 高:[1,2,3,4,5,6]
// 只有知道 列数, 才能推出在第几行 所以 列数必须传
`void func(int (*arr)[3], int rows);`表示 arr 是一个 指向包含3个int的数组的指针。
方式 | 书写格式 | 适用场景 | 说明 |
---|
按指针传递 | void func(int (*arr)[3], int rows); | 固定列数 | 不能自动推导列数 |
按引用传递 | void func(int (&arr)[2][3]); | 固定大小数组 | 不会退化,自动推导大小 |
使用 std::vector | void func(const vector<vector<int>>& arr); | 动态二维数组 | 灵活,可变大小 |
使用 std::array | void func(const array<array<int, 3>, 2>& arr); | 固定大小数组 | 兼顾 安全性和性能 |
5. 指针与引用的综合
方式 | 书写格式 | 说明 |
---|
指针的引用 | void func(int*& p); | 修改指针本身 |
数组指针 | void func(int (*arr)[3], int rows); | 适用于二维数组 |
二维数组引用 | void func(int (&arr)[2][3]); | 适用于固定大小的二维数组 |
🌟 总结
- 小数据类型(int, double) → 按值传递
- 大对象(std::string, std::vector, class) → 按引用传递
- 不修改数据 → 使用
const &
- 数组 → 传指针(
int* arr
)或引用(int (&arr)[size]
) - 类对象 → 传引用(
Person& p
)或 const
引用
这样写更高效、易读、安全!🚀