2013-12-15 105 views
3

我行的這些代碼從一個程序我的老師提出:operator ++()和operator ++(int)有什麼區別?

TimeKeeper& operator++() { 
     d_seconds++; 
     return *this; 
    } 
    const TimeKeeper operator++(int) { 
     TimeKeeper tk(*this); 
     ++(*this); 
     return tk; 
    } 

和我的老師問我們是「運營商+()返回一個引用和操作++(int)返回一個值的問題之一,解釋爲什麼?」

任何人都可以解釋這對我? 如果你需要代碼的其餘部分,我不介意把它放在! 謝謝!

回答

5

operator++()前增量運營商(++x),而operator++(int)後增量運營商(x++)。如果您瞭解如何這些操作的工作,那麼你應該可以解釋爲什麼其中一個必須返回副本。

舉一個簡單的例子:

int x = 1; 

std::cout << x++ << "\n"; // prints 1 
std::cout << ++x << "\n"; // prints 3 

發生了什麼事2

x值在x++表達成爲21印刷(的x值增量操作之前)。

在第二個聲明中,x的值在++x表達式中變爲3

+1

這並不能解釋爲什麼,但這是問題的關鍵部分。 –

+0

我可以解釋爲什麼,但很明顯這是某種類型的作業,需要一些個人的努力來理解正在發生的事情的基本原理。 – Chad

+1

如果這是你的想法,那麼投票結束而不是回答或只是在評論中提示。 –

4

沒有額外的int的是預增量運算符,而具有額外的int參數的那個是增量後運算符。這個有點笨拙符號是一劈區分兩個符號的有些和int不能用於任何有用的目的:

TimeKeeper keeper; 
++keeper; // pre increment: calls TimeKeeper::operator++() 
keeper++; // post increment: calls TimeKeeper::operator++(int) 

預增量和後增量之間的區別在於,對於預增量的值表達式是增量之後,而後增量是表達式之前的值。對於遞增遞增,應用增量的對象向前移動,並返回表示遞增前的狀態的不同對象。表示前一狀態的對象是隻存在於表達式中並且因此需要按值返回的臨時對象。對於預增量,只涉及一個值,可以通過引用立即返回。

在上面的代碼片段中,沒有使用keeper++的結果:在使用結果時,您應該只使用後增量運算符。否則,它只會浪費創建一個臨時對象,幾乎沿着老師的代碼行,然後扔掉。即使建設很便宜,也可能會浪費幾個CPU週期。除非必要,否則相同的重載和推理不適用於遞減運算符operator--()。奇怪的是,C++因此是不是慣用的C++!

+0

+1不僅因爲它是正確的,而且因爲最後一句讓我微笑。 – Chad

0

要區分這兩個運算符,必​​須存在一些語法差異。因此爲了區分後增運算符和預增運算符,將未使用的int類型參數添加到後增運算符的聲明中。預增量運算符返回對象本身。這就是爲什麼它的返回類型是引用。 postincrement操作符返回一個臨時對象並增加原始對象。這是它返回一個值的方式。

相關問題