系列文章目录
值传递和引用传递是 C++ 中两种常见的参数传递方式,它们的主要区别在于函数内部对参数的操作是否会影响原始数据
C++值传递和引用传递
- 系列文章目录
- 1、值传递
- 2、引用传递
- 3 、常量引用传递
- 4、值传递 vs 引用传递
- 总结
1、值传递
值传递会复制传入的参数,函数内部对参数的修改不会影响原始数据
#include <iostream>
#include <vector>
using namespace std;void modify(int a){a = 100; // 修改副本的值cout << "modify函数中: a = " << a << endl;
}int main() {int a=10;cout<< "原始变量a的值为:" <<a <<endl;modify(a);cout<< "调用函数之a的值为:" <<a <<endl;return 0;
}
输出:
原始变量a的值为:10
modify函数中: a = 100
调用函数之a的值为:10
解释:
在 modifyValue 函数中,x 是 a 的副本。
修改 x 不会影响原始变量 a。
2、引用传递
引用传递会直接操作原始数据,函数内部对参数的修改会影响原始数据
#include <iostream>
#include <vector>
using namespace std;void modify(int &a){a = 100; // 修改副本的值cout << "modify函数中: a = " << a << endl;
}int main() {int a=10;cout<< "原始变量a的值为:" <<a <<endl;modify(a);cout<< "调用函数之a的值为:" <<a <<endl;return 0;
}
这里修改的地方只是在modify函数中加了一个&
输出结果:
原始变量a的值为:10
modify函数中: a = 100
调用函数之a的值为:100
解释:
在 modifyReference 函数中,x 是 a 的引用。
修改 x 会直接影响原始变量 a。
3 、常量引用传递
如果你不想用值传递(因为会增加拷贝数据的内存开销),又不想修改原始数据,你使用这个就很合适哦。
常量引用传递既避免了值传递的拷贝开销,又防止函数内部修改原始数据
void modify(const int &a){a = 100; // 修改副本的值 这里直接会编译报错,const修饰的变量无法被修改cout << "modify函数中: a = " << a << endl;
}
const修饰的变量无法被修改。
#include <iostream>
#include <vector>
using namespace std;void modify(const int &a){// a = 100; // 修改副本的值 这里直接会编译报错,const修饰的变量无法被修改cout << "modify函数中: a = " << a << endl;
}int main() {int a=10;cout<< "原始变量a的值为:" <<a <<endl;modify(a);cout<< "调用函数之a的值为:" <<a <<endl;return 0;
}
输出如下:
原始变量a的值为:10
modify函数中: a = 10
调用函数之a的值为:10
解释:
在 printValue 函数中,x 是 a 的常量引用。
函数内部不能修改 x,但可以读取其值。
4、值传递 vs 引用传递
对于复杂数据结构(如 std::vector 或 std::string),值传递会导致整个数据被复制,而引用传递则避免了这种开销。
#include <iostream>
#include <vector>
using namespace std;// 值传递示例
void modifyVectorByValue(vector<int> vec) {vec[0] = 100; // 修改副本cout << "modifyVectorByValue function (值传递): ";for (int x : vec) {cout << x << " ";}cout << endl;
}// 引用传递示例
void modifyVectorByReference(vector<int> &vec) { // 使用引用传递vec[0] = 100; // 修改原始数据cout << "modifyVectorByReference function (引用传递): ";for (int x : vec) {cout << x << " ";}cout << endl;
}int main() {vector<int> vec = {1, 2, 3};cout << "原始数据: ";for (int x : vec) {cout << x << " ";}cout << endl;modifyVectorByValue(vec); // 值传递调用cout << "调用值传递之后: ";for (int x : vec) {cout << x << " ";}cout << endl;modifyVectorByReference(vec); // 引用传递调用cout << "调用引用传递之后: ";for (int x : vec) {cout << x << " ";}cout << endl;return 0;
}
输出如下:
原始数据: 1 2 3
modifyVectorByValue function (值传递): 100 2 3
调用值传递之后: 1 2 3
modifyVectorByReference function (引用传递): 100 2 3
调用引用传递之后: 100 2 3
总结
特性 | 值传递 | 引用传递 | 常量引用传递 |
---|---|---|---|
是否复制数据 | 是 | 否 | 否 |
是否能修改原始数据 | 否 | 是 | 否 |
性能 | 较低(需要复制数据) | 较高(直接操作原始数据) | 较高(避免复制且不可修改) |
使用场景 | 数据简单且不需要修改原始数据 | 需要修改原始数据 | 只需读取数据而不修改 |