簡體   English   中英

我的參考變量發生了什么?

[英]What is happening with my reference variables?

我試圖擺脫C ++中的引用的束縛(我想我已經在Java和Javascript中得到了引用,但是過渡比我想象的要難)。 這是一段代碼片段,其結果我不明白:

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> x;
    x.push_back(1);

    std::vector<int> y;
    y.push_back(2);

    std::vector<int>& r=x;
    r.push_back(3);

    std::vector<int>& s=r;
    s.push_back(4);

    s=y;
    r.push_back(5);
    s.push_back(6);

    std::cout<<"x: ";
    for(int i: x) {std::cout<< i<< " ";} std::cout<<"\n";

    std::cout<<"y: ";
    for(int i: y) {std::cout<< i<< " ";} std::cout<<"\n";

}

我得到以下輸出(使用g ++ 4.9.2):

x:2 5 6

y:2

我不明白這一點:元素1、3、4變成了什么? 我本來希望x為1,3,4,5,y為2,6。 具有整數向量的事實是否有所不同?

要點: 引用不可重復。 初始化引用后,它將始終引用同一對象。

現在,讓我們逐步分析您的代碼:

std::vector<int> x;
x.push_back(1);

x是一個包含1的向量。

std::vector<int> y;
y.push_back(2);

y是一個包含2的向量。

std::vector<int>& r=x;
r.push_back(3);

r是對x的引用, x現在包含1 3

std::vector<int>& s=r;
s.push_back(4);

s是對x的引用, x現在包含1 3 4

s=y;

現在,您已將向量y復制到向量x (通過引用s引用s )。 它將x的內容替換為y的內容,即2

r.push_back(5);
s.push_back(6);

xrs引用)現在包含2 5 6

y在創建單個push_back之后從未被修改過,因此它僅包含2


Java稱為“引用”的概念實際上是C ++中的“指針”。 使用指針,代碼將如下所示:

std::vector<int>* r = &x;
r->push_back(3);

std::vector<int>* s = r;
s->push_back(4);

s = &y;

r->push_back(5);
s->push_back(6);

然后, x將包含1 3 4 5 ,而y將包含2 6

請注意,用於創建指向對象的指針(獲取對象的地址)的語法要求顯式使用地址運算符& 同樣,取消引用指針也需要顯式語法: *p用於簡單地獲取指向的對象,或p->m用於訪問p指向的對象的成員m

引用一次綁定到一個對象,永遠無法重新定位。 根本沒有語法。 如使用s.push_back所看到的,每當您命名s您都將訪問參考對象 r (實際上,它是x )。

因此, s=y不會使參考引用其他向量。 您在此處所做的與x=y相同。 x中原來所有的元素都將丟失。

Java中的引用語義與C ++中的引用語義幾乎保持零關系。 您最好立即停止嘗試比較兩者,或者從一個“過渡”到另一個。 帶着清新的頭腦來學習C ++。

分配s=y; 其中s表示x ,導致將y復制到x ,從而覆蓋(1,3,4)。 因此x變為(2),然后附加5和6。同時y保持不變,最后變為(2)。

暫無
暫無

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

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