在 C++ 中按引用呼叫與按值呼叫的比較

Jinku Hu 2023年1月30日 2021年4月29日
  1. 在 C++ 中使用&符號通過引用來呼叫函式
  2. 使用純函式定義在 C++ 中按值呼叫函式
在 C++ 中按引用呼叫與按值呼叫的比較

本文將解釋幾種在 C++ 中如何通過引用進行呼叫與通過值進行呼叫的方法。

在 C++ 中使用&符號通過引用來呼叫函式

函式引數是函式定義的核心部分,因為它們是用於初始化函式引數的值。當引數是引用時,它將繫結到引數,並且引數的值不會被複制。相應的行為稱為通過引用傳遞,或者該函式通過引用呼叫。請注意,此方法在需要在函式之間傳遞相對較大的物件時更常用,因為它節省了複製過程佔用的額外資源。

在函式內部對物件執行的操作將修改變數的原始儲存位置,這類似於將指標傳遞給物件的方法。在下面的示例中,我們演示了 func 函式,該函式帶有單個 int 型別引數並分配了 123 值。i 符號只是 main 程式中原始 j 物件的別名。請注意,&符號在 C++ 中是過載的,不應與操作符地址功能混淆。

#include <iostream>

using std::cout; using std::endl;

void func(int &i)
{
    i = 123;
}

int main()
{
    int j = 0;
    func(j);
    cout << "j = " << j  << endl;

    exit(EXIT_SUCCESS);
}

輸出:

j = 123

使用純函式定義在 C++ 中按值呼叫函式

當給定函式確實複製引數並將其作為單獨的物件儲存在相應範圍中時,通常會說通過值呼叫該函式是為了表現該行為。相應的符號不需要任何不同的符號,但是將引數指定為純變數。因此,功能塊的作用域有一個單獨的物件,對其的修改不會影響 main 函式的原始變數。當傳遞的引數是內建型別或易於在函式之間複製的小物件時,最常見的做法是採用按值呼叫方法。

#include <iostream>

using std::cout; using std::endl;

void func2(int i)
{
    i = 123;
}

void func(int &i)
{
    i = 123;
}

void func(int *ip)
{
    *ip = 123;
    ip = nullptr;
}

int main()
{
    int j = 0;
    func(j);
    cout << "j = " << j  << endl;

    j = 0;
    func2(j);
    cout << "j = "  << j << endl;

    j = 0;
    func(&j);
    cout << "j = "  << j << endl;

    exit(EXIT_SUCCESS);
}

輸出:

j = 123
j = 0
j = 123
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Function