簡體   English   中英

C ++:取消引用實際上在做什么?

[英]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 = 8z = 9 ,那么de-reference如何在一種情況下返回address ,而在另一種情況下返回value呢? 更重要的是, C++如何進行區分?

就像在您的Test類函數中一樣。

int y = *p;
int& z = *p;

yp指向的副本。 zp指向的引用 (不是地址)。 因此,更改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.

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