[英]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中
*this
是Clock
的當前實例。 就像您正確地說的那樣,這將調用復制構造函數,但此方法應為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.