簡體   English   中英

C ++參數傳遞

[英]C++ argument passing

好的,所以我剛開始學習C ++,並且發現參數傳遞的來龍去脈有點令人困惑。 我在C ++書中碰到了以下內容;

在C ++中,按引用傳遞是通過兩種方式完成的:使用指針和使用引用。

然后繼續顯示一個程序,該程序切換兩個int值(x和y)的值(如下所示)。 我想知道,在這種情況下, swap()函數的參數是否真的通過引用傳遞了? 我以為他們是通過地址傳遞的,有人告訴我這只是通過值傳遞的一種特殊情況。

//Listing 9.6 Demonstrates passing by reference 

#include <iostream.h>

void swap(int *x, int *y);

int main()
{
    int x = 5, y = 10;

    cout << "Main.  Before swap, x:  " << x
         << " y: " << y << "\n";
    swap(&x,&y);
    cout << "Main. After swap, x:  " << x
         << " y: " << y << "\n";
    return 0;
}
void swap(int *px, int *py) 
{
    int temp;

    cout << "Swap.  Before swap, *px: "
         << *px << " *py: " << *py << "\n";

    temp = *px;
    *px = *py;
    *py = temp;

    cout << "Swap. After swap, *px: " << *px
         << " *py: " << *py << "\n";

}

很好地融合了抽象級別。

最低級別:通過值傳遞C ++指針時,將復制指針值。

更高級別:通常指針指向某個對象,並且該對象在邏輯上是通過引用傳遞的。

在C ++中通過引用傳遞的最直接方法是使用引用參數。 在某種程度上,C ++引用可以(在某些情況下)是一個指針,但是無法訪問或確定有關該指針值的任何內容。 因此,說引用是按值傳遞或復制是沒有意義的,相反,我們談論的是綁定引用或綁定到引用。

在正確的程序中,引用不能為空引用,這對於作為形式參數類型的引用來說是一個明顯的優勢。

另一個優點是可以const的引用綁定到臨時對象,例如

void foo( const std::string& s ) ...

可以這樣稱呼

foo( "Blah!" )

當使用引用代替“實現”邏輯傳遞引用的指針時,這是不可能的。

你是對的。 功能

void swap(int *x, int *y);

正在按值接受參數。 因為參數是指針,所以它可以取消引用它們,從而修改它們指向的內存。 盡管如此,指針本身(地址)還是按值傳遞的。 您可以看到,如果swap為其參數之一分配了不同的值(地址),則該更改不會反映在調用方中。

int a = 1;
int b = 2;
int * pa = &a;
int * pb = &b;
swap(pa, pb);
assert((pa == &a) && (pb == &b));

嘗試添加類似的內容

px += 12;
py += 17;

swap結束時。 assert仍將保持。

在C ++中,指針本身就是一個對象。 它有一個值(它指向的地址),可以復制或分配一個不同的值。 就像其他對象一樣,它也可以按引用或按值傳遞。

可以通過指針引用的函數看起來像這樣。

#include <iostream>

void
pointer_by_reference(int * & p)
{
  p = nullptr;
}

int
main()
{
  int a;
  int * pa = &a;
  pointer_by_reference(pa);
  std::cout << "&a = " << &a << ", pa = " << pa << "\n";
}

可能的輸出:

&a = 0x7ffcfdf2e00c, pa = 0

如您所見, pointer_by_reference更改了pa的值。

當您捕獲變量的地址時 ,此處按地址調用 如果通過引用調用,我們使用void swap(int &x, int &y); 作為原型。

詳細信息檢查按引用調用和按指針調用之間的差異

還可以參考了解知識,C ++中的指針變量和引用變量之間有什么區別?

基本上有兩種參數傳遞技術。

  1. 按值致電
  2. 按引用呼叫(也稱為按地址呼叫)

您的代碼確實是通過引用傳遞參數。

使用按值調用時,將數據傳遞給過程中的參數時,僅該值可用於過程的參數。 因此,對過程中的參數所做的任何更改都不會影響調用例程的變量。

但是通過引用調用,變量的地址可用於參數。 換句話說,參數實際上指向與變量相同的位置。 因此,在過程中更改參數實際上會更改傳遞給它的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM