C++值传递和引用传递

系列文章目录

值传递和引用传递是 C++ 中两种常见的参数传递方式,它们的主要区别在于函数内部对参数的操作是否会影响原始数据

C++值传递和引用传递

  • 系列文章目录
  • 1、值传递
  • 2、引用传递
  • 3 、常量引用传递
  • 4、值传递 vs 引用传递
  • 总结


1、值传递

值传递会复制传入的参数,函数内部对参数的修改不会影响原始数据

#include 
#include 
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 
#include 
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 
#include 
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 
#include 
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 

总结

特性 值传递 引用传递 常量引用传递
是否复制数据
是否能修改原始数据
性能 较低(需要复制数据) 较高(直接操作原始数据) 较高(避免复制且不可修改)
使用场景 数据简单且不需要修改原始数据 需要修改原始数据 只需读取数据而不修改

你可能感兴趣的:(c++,算法,开发语言)