簡體   English   中英

前綴/后綴增量運算符

[英]Prefix/Postfix increment operators

我想確保我理解按值傳遞和正確傳遞。 特別是,我正在查看對象的increment ++運算符的前綴/后綴版本。

假設我們有以下類X

class X{
private:
    int i;
public:
 X(){i=0;}
 X& operator ++ (){ ++i; return *this; } //prefix increment

 X operator ++ (int unused){ //postfix increment
  X ret(*this);
  i++;
  return ret;
 }

 operator int(){ return i; } //int cast
};

首先,我是否正確實現了前綴/后綴增量運算符?

第二,與前綴運算符相比,后綴運算符的內存效率如何? 具體來說,當使用每個版本的運算符時,會創建多少個X對象副本?

准確地解釋通過引用返回和按值返回會發生什么可能有助於我理解。


編輯:例如,使用以下代碼...

X a;
X b=a++;

... a和b現在是別名嗎?

在后綴增量中調用對象本身的前綴增量更為慣用:

X operator++(int)
{
    X copy(*this);
    ++*this;         // call the prefix increment
    return copy;
}

因此,遞增X對象的邏輯僅包含在前綴版本中。

這是一個正確的實現。 通常情況下,后綴運算符的性能會更差,因為您必須在執行增量之前創建另一個副本(這就是為什么我習慣於始終使用前綴,除非我需要其他東西)。

通過引用返回,您將返回對當前對象的l值引用。 編譯器通常會通過返回當前對象的地址來實現它。 這意味着返回對象就像返回一個數字一樣簡單。

但是,按值返回,必須完成復制。 這意味着在返回期間(而不僅僅是地址)復制更多信息以及要調用的復制構造函數。 這就是您的性能受到影響的地方。

您的實施效率與典型實施相當。

編輯:關於你的附錄,不,它們不是別名。 您已創建兩個單獨的對象。 按值返回時(以及從后綴增量運算符中創建新對象時),此新對象將放置在不同的內存位置。

但是,在以下代碼中,a和b 別名:

 int a = 0;
 int& b = ++a;

b是引用a的地址。

您的操作員已正確實施。

在前綴運算符中,不會生成X的副本。

在后綴運算符中,為ret做了一個副本,從函數返回時可能會生成另一個副本,但是所有編譯器都會忽略此副本。

暫無
暫無

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

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