簡體   English   中英

在 C++ 中傳入 vs assign const 引用

[英]Pass in vs assign const reference in C++

const string& x = functionA();

functionB(x); // depends on x is string or const string&
string str = x;

我們有 const ref x:

  1. 傳遞給functionB,所以基本上我們復制x的值並傳遞給functionB? (不,取決於 x 是否參考)

  2. 將 x 賦值給 str,所以這里我們也復制 x 的值? 或者我們只是分配參考?

========================

是的,我理解函數 B(x),它取決於傳入的 x 是字符串還是字符串&。 我現在的困惑仍然是關於作業的第二個困惑。

如果我們有類似的東西:

obj.fieldA = x;

obj 已創建,我們只需將 x 分配給 obj 的 fieldA。 那么這里的 x 是副本還是只是參考?

  1. 用 'x' 調用 'functionB' 我們只是傳遞了這個引用所持有的那個值。
    順便說一句,引用的行為與指針非常接近。 它類似於:
    void func(int val);

    int a = 11;
    int *ptr = &a;
    func(*ptr); // same as functionB(x);

所以你是否會通過復制傳遞它實際上取決於functionB的形參;

  1. 這里我們有類似的情況。
    在這一行:
    string str = x;
    您正在初始化(創建)字符串 'str' 通過將引用 'x' 持有的值傳遞給它的構造函數(不要與賦值混淆,因為 str 是在這一行創建的),並且由於我們有構造函數的分離為了移動語義,在這里您將通過 const 引用將“x”傳遞給“str”的構造函數以復制它。

更新:
這個obj.fieldA = x; 表示您已經創建了Object obj;
據此,聲明obj.fieldA = x; 將只是復制'x'。
也許我不明白你的最后一個問題,但假設 fieldA 又是“字符串”類型;
然后,當你寫obj.fieldA = x; ,會有類似的東西(非常糟糕的例子,只是為了簡化):

string& operator=(const string& other){
    ..
    this->str_pointer = new char[other.size() + 1];
    strcpy(this->str_pointer, other.str_pointer);
    ..
} 


這意味着這個 function 獲取了“x”的地址並復制了它的數據。
總結一下:

string first = "text";
const string& x = first; // x behaves just like a pointer and holds address of 'first'
Object obj;
obj.fieldA = x; // <--- here

在我標記的行,由於聲明了 'operator=' 接收引用(地址),您將只傳遞 'x' 的地址,然后 'operator=' 將查看此 memory 地址並制作數據副本,放置在那里.
因此,我們只是將“x”的值分配給.fieldA,而不是引用。

暫無
暫無

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

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