[英]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);
x
( r
和s
引用)現在包含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.