[英]C++: What is a de-reference actually doing?
我正在閱讀Stroustrup's
第四版: The C++ Programming Language
。 我有python/java
背景,因此到目前為止的前4章都還不錯。
在Chapter 3
我看到了:
complex& operator+=(complex z) { re+=z.re , im+=z.im; return ∗this; }
這開始了一天的嘗試來寫這個問題:
首先,我發現它返回的是對該對象的引用,而不是副本。 正如我能夠在這個問題上證實的那樣。
而且我能夠理解從這個問題將reference variable
返回到reference variable
與常規變量之間的區別
我做了自己的審判
class Test {
public:
Test():x{5}{}
int x;
void setX(int a) {x = a;}
Test& operator+=(Test z) {x+=z.x; return *this;}
// the keyword this is a pointer
Test* getTest() {return this;}
// but I can return the reference by *this
Test& getTest1() {return *this;}
// or I can return a copy
Test getTest2() {return *this;}
};
這使我提出疑問,為什么將其稱為de-reference
,所以我進行了此試驗
int x = 8;
int* p = &x;
int y = *p;
int& z = *p;
x++; // let's have some fun
std::cout << y << std::endl;
std::cout << z << std::endl;
如預期的y = 8
和z = 9
,那么de-reference
如何在一種情況下返回address
,而在另一種情況下返回value
呢? 更重要的是, C++
如何進行區分?
就像在您的Test類函數中一樣。
int y = *p;
int& z = *p;
y
是p
指向的副本。 z
是p
指向的引用 (不是地址)。 因此,更改z
更改*p
,反之亦然。 但是改變y
對*p
沒有影響。
可以將指針int* p
視為指向類型為int
數據所在的地址。 取消引用時,系統將檢索該內存地址處的值(該地址是p
本身的實際值)。 在int y = *p;
的情況下int y = *p;
您將那個int
值的副本作為定位符值 y
放到了堆棧上。
另一方面,在*p = 13;
的左側取消引用*p = 13;
表示您要用右側值13
替換存儲在由p
值表示的內存地址中的int
值*p
。
int& z
中的參考左值int& z
int& z = *p;
不是 p
指向的int
值的副本,而是對*p
返回的特定內存地址處的內容(即p
本身所持有的實際值)的左側引用。
這並不意味着您的人為情況會有所不同,但是,例如,給定具有Foo::incrementCount()
值的Foo
類,
Foo* p = new Foo();
p->incrementCount();
Foo& ref = *p;
ref.incrementCount();
對於相同實例的相同方法將被調用兩次。 相反, Foo foo = *p
實際上將復制整個Foo
實例,並在堆棧上創建一個單獨的副本。 因此,調用foo.incrementValue()
不會影響p
仍指向的單獨對象。
如預期的y = 8和z = 9,那么取消引用如何在一種情況下返回地址,而在另一種情況下返回值? 更重要的是,C ++如何進行區分?
取消引用返回了兩種情況下引用的實際事物。 因此,C ++沒有區別。 區別在於取消引用的結果。
如果你做int j = <something>;
然后將某物的結果用於初始化j
。 由於j
是整數,因此<something>
必須是整數值。
如果您做int &j = <something>;
然后,事物的結果仍將用於初始化j
。 但是現在, j
是對整數的引用,並且<something>
必須是整數,而不僅僅是整數。
因此, *this
兩種情況的作用相同。 使用值的方式不會影響該值的計算方式。 但是您如何使用它確實會影響您使用它時會發生什么。 並且這兩段代碼不同地使用了被取消引用的對象。 在一種情況下,采用其值。 在另一種情況下,將引用綁定到該引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.