[英]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.