C++ 中按值调用和按引用调用之间的区别

在C++编程中,我们有不同的方法将参数传递给函数,主要是通过值调用和通过引用调用方法。这两种方法的不同之处在于作为参数传递给它们的值的类型。

在研究按值调用和按引用调用方法之前,我们首先需要了解什么是实际参数和形式参数。

实际参数也称为参数,是当我们进行函数调用时传递给函数的参数,而形式参数是我们在函数或方法定义中看到的参数,即函数接收的参数。

C++ 中的按值调用
在按值调用方法中,函数参数通过复制实际参数的值来传递,确保原始值保持不变。该值被复制到形式参数。

按值调用的示例
下面的示例通过更新变量的原始值演示了按值调用的工作原理。

// C++ program to demonstrate call by value 

include <iostream> 
using namespace std; 

// function to update the original value 
void increment(int num) 

    num++; 
    cout << num << endl; 


int main() 

    int number = 5; 
    increment(number); // Passing 'number' by value 
    cout << number << endl; 
    return 0; 
}

输出
6
5

说明:在上面的程序中,“number”作为实际参数传递给函数increment,并在函数中作为形式参数“num”传递,用于存储“number”的值。在该函数中,“num”的值增加,但“number”的值没有变化。这就是我们所说的“按值调用”。

C++ 中的引用调用
在引用调用方法中,将实际参数的内存地址(引用)传递给函数,允许直接访问和修改原始值。实参和形参指向同一个内存地址。对函数内参数所做的任何更改都会直接反映在函数外的原始值中。

通过引用调用的示例
下面的示例演示了引用调用的工作原理。

// C++ program to demonstrate the working of call by 
// reference 

include <iostream> 
using namespace std; 

// function to update the original value 
void increment(int& num) 

    num++; 
    cout << num << endl; 


int main() 

    int number = 5; 
    increment(number); // Passing 'number' by reference 
    cout << number << endl; 
    return 0; 
}

输出
6
6

说明:在上面的代码中,变量“number”被传递给函数increment。形式参数“num”指向与“number”相同的地址。当函数增加参数的值时,“num”中所做的更改会反映在“number”中,正如我们从输出中看到的那样。这就是我们所说的“通过引用调用”。

C++中按值调用和按引用调用的区别
传递值    

  • 在按值调用方法中,变量的值被传递给函数。    
  • 在通过引用调用时,传递变量的内存地址。

变更范围  

  •  在按值调用方法中,即使我们对函数进行更改,原始值也保持不变。  
  •  在按引用调用方法中,所做的更改反映在原始变量中。

性能 

  • 按值调用:  复制可能需要额外的内存和时间,因此效率较低。  
  •  与“按值调用”相比,按引用调用的内存和时间效率更高。

内存位置 

  • 按值调用:  实参和形参的内存地址不同。    
  • 按引用调用:实参和形参指向同一个内存地址。

应用领域 

  • 按值调用:   主要用于小数据传递值或者当我们不想改变原始值时。    
  • 按引用调用:当我们想要修改原始值或者节省资源时使用它。

结论
通过了解“按值调用”和“按引用调用”这两种参数传递方法的区别,我们可以根据C++程序的具体需求和功能来选择合适的参数传递方法。