簡體   English   中英

后增量++運算符重載中的指針

[英]pointer in post increment ++ operator overloading

Clock Clock::operator++(int x)
{
    Clock oldState= *this;
    tick();

    return *oldState;
}

運算符重載函數創建一個指向* this的對象oldState。 這意味着什么? 它是否將本地對象的地址分配給oldState? 還是使用=運算符重載(調用復制構造函數)。 它有什么作用?

並返回* oldState,這是否超出范圍,因為您沒有在堆上聲明它?

首先這段代碼

Clock Clock::operator++(int x)
{
    Clock oldState= *this;
    tick();

    return *oldState;
}

無效,因為返回的表達式不能轉換為Clock類型。 返回表達式的類型為Clock *不是Clock。 正確的運算符可能如下所示

Clock Clock::operator++( int )
{
    Clock oldState= *this;
    tick();

    return oldState;
}

這個說法

    Clock oldState= *this;

表示名稱為oldState的新對象是通過使用應用於原始對象(即* this)的復制構造函數創建的。 該對象由函數返回。

return *oldState; 似乎是一個錯誤,應該return oldState;

return oldState; 可以,因為它在堆棧上返回了一個副本

Clock oldState= *this; 是否獨立制作副本並將其存儲在oldState中

*thisClock的當前實例。 就像您正確地說的那樣,這將調用復制構造函數,但此方法應為oldState

它會將當前狀態復制到在堆棧上分配的新對象Clock上,然后真正進行增量操作,然后返回之前保存的對象(但我確實認為有錯字,並且在oldState之前不應有*否則它將無法編譯)。

這是預期的行為,因為后綴增量應該在增量之前返回對象的狀態。 在int上,它不會令您震驚嗎?

unsigned int i = 2;
std::cout << i++ << std::endl;

輸出將為2 ,而對於:

unsigned int i = 2;
std::cout << ++i << std::endl;

輸出將為3

對於支持后綴增量的所有對象,應該發生相同的事情。

暫無
暫無

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

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