簡體   English   中英

為什么或在什么情況下,您會將參數傳遞給函數作為C ++中的引用(或指針)?

[英]Why, or in what situations, would you pass an argument to a function as a reference (or pointer) in C++?

我習慣於在自己的代碼中定期傳遞參數,但是經常在閱讀別人的C ++代碼時偶然發現函數參數是通過引用或指針傳遞的。 我不明白這樣做的目的是什么。 有人可以解釋一下嗎?

這樣做的原因基本上有三個。

減少內存使用

每次調用函數時,都會復制並傳遞參數。 當您傳遞數字時,這沒什么大不了的。 但是,當您處理大塊內存時,例如對象,結構,數組等,這將變得非常昂貴。

因此,所有復雜類型通常都作為指針傳遞。 如果要拋出對象,則始終使用指針。

在這種情況下,應使用const限定詞表示該變量不會被更改。

修改參數

有時,修改傳遞的參數很有用,盡管應避免使用這種不良樣式。 我認為最好的例子是修改數組,例如push()函數。 另一個是修改對象的公共成員,或者要從函數返回多個值時。

請注意,這可能是錯誤的來源。 如果要修改傳遞的變量,則從函數名稱中可以明顯看出這就是您正在執行的操作。

低級內存訪問

任何直接與內存配合的東西都希望直接訪問該內存。 C語言中的標准做法,但在C ++中不那么常見。 查看類似memcpy()函數以及<string.h>其他任何函數。

如果將一堆字符傳遞給函數,則可以在函數內部進行更改,它們在函數外部將保持不變。 這意味着,如果您希望將某些文本大寫,則必須對其進行復制,然后更改一些字母。

另一方面,如果您告訴函數該字符串在內存中的地址,則它可以更改現有字符串而不進行復制。 有時,所需的參數將消耗很小的大小。 有時,所需的數據占用數百兆/千兆/兆字節。 您要做的最后一件事是讀入所有內容,然后制作一份副本以發送給函數。

引用和指針之間的區別主要是對程序員來說方便的語法,但是該規則也有一些重要的例外。

如果將參數傳遞給函數,則可以在函數內部對其進行更改。 該函數的執行完成后,傳入的變量將重命名為不變。

int square_this_number(int x)
{
    int y = 0;
    y = x * x;

    x = 1000;
    return y;
}

int a = 10;
int b = 0;

b = square_this_number(a);
/* a is still 10, not 1000. */
/* b is 100. */

通過引用傳遞或通過指針傳遞意味着您希望在函數執行完成后保留更改。

int try_square_and_change_input(int& x)
{
    int y = 0;
    y = x * x;

    x = 23;
    return y;
}

int a = 5;
int b = 0;

b = try_square_and_change_input(a);
/* a is now 23 instead of just 5. */
/* b is 25 of course. */

您可以參考以下頁面: https : //www.ibm.com/support/knowledgecenter/zh-CN/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbclx01/cplr233.htm

這樣做的原因包括:

  • 我需要修改不是所調用函數本地的變量。
  • 我想將一個單詞傳遞給函數,而不是復制大型結構或數組(如果需要修改,可能還要復制一個)。
  • 它是指向共享內存的指針,我希望更改在不同的進程或線程中可見。
  • 它是指向多態結構或聯合(或C ++中的類)的指針,我希望該函數能夠在運行時確定正確的類型。
  • 數據的大小和類型可能會有所不同,例如memcpy()
  • 該類型對於客戶端代碼應該是不透明的。
  • 這就是指定接口的方式。

按值傳遞:當我們不想更改被調用函數的變量值時。

通過引用傳遞:(僅在c ++中,而不在c中):當我們想通過調用函數對variabe進行更改時。

通過指針傳遞:與periferi相同,但與參考點相同。

暫無
暫無

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

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