2013-04-12 128 views
2

想象以下情形:指向參考點或值的參考點的指針?

class ABC 
{ 
    public: 
    int abc; 
}; 

ABC& modifyABC(ABC& foo) 
{ 
    foo.abc+=1337; 
    return foo; 
} 

void saveABC(ABC& bar, std::vector<ABC*>& list) 
{ 
    list.push_back(&modifyABC(bar)); 
} 

int main() 
{ 
    ABC foobar; 
    std::vector<ABC*> ABCList; 
    saveABC(foobar,ABCList); 
    return 0; 
} 

modifyABC()返回到ABC的參考(其內部是某種指針的太AFAIK)。 「&」操作符的「地址」現在是否返回指向參考地址或參考後面的實際對象的指針?

+0

在C++中,不存在指向引用的指針。 – fredoverflow

回答

1

modifyABC()返回到ABC基準(其內部是某種指針的太AFAIK

不完全

指針是需要一些存儲空間的對象(變量),並在該存儲器中保存另一個對象的內存地址。 參考文獻是純的別名,像替代名稱。理論上,他們根本不需要任何存儲。

每個段落的C++ 11標準的8.3.2/4:

它是未指定的參考是否需要存儲(3.7)。

因此,一個指針到參考實際上是一個指針引用的對象,以及上的參考(除了它結合在初始化對象的行爲)完成的任何操作實際上是在完成對象的引用是別名

+0

我所知道的每一個編譯器實際上都將引用實現爲指針,因此在引擎蓋下它們確實有一個地址並佔用了空間。另一方面,所需的引用語義是這樣的,你不能看到這些實現細節。 –

+0

@JamesKanze:好的,謝謝你指出。我編輯了我的答案。 –

+0

Wonderfull,這就是我想知道的! –

1

我與你的問題的最後一句掙扎(「的指針引用的住址」?)

什麼可以說的是,modifyABC()需要一個ABC參考,並準確地返回相同的參考。沒有對象的副本。

您的代碼的總體效果是foobar的地址被附加到ABCList

0

引用和指針是兩個不同的概念。您可能會將參考視爲現有對象的別名。所以就像別名到別名一樣,它也是原始對象的別名,這裏modifyABC()的返回值也是對原始對象的引用。把指針指向一個引用總是返回你引用的對象的地址。

1

是否「&」操作符的「地址」是否返回指向參考地址或參考後實際對象的指針?

在C++中,引用,因此,沒有他們自己地址。所以引用的地址意味着引用所指對象的地址。

X x; 
X &r = x; //reference 
X *p = &r; //same as &x 

希望有所幫助。

+1

謝謝!簡單的問題,我知道你們,我無法找到一個確切的答案。 –

1

你對一個參考文件(包括其地址)做的任何事情, 與做參考對象相當。在 C++中,引用本身是而不是的一個對象,並不一定是 佔用內存中的空間,並且沒有地址。