[英]operator overloading passed and returned arguments
我在c ++的很多例子中看到,運算符重載作為參數獲取通過引用傳遞的類實例,或者如果它返回一個類實例,它也通過引用返回它。 是否有任何理由為什么人們選擇通過引用傳遞它而傳遞指針/按值也會起作用? 一個例子 :
Class MyClass
{
public:
int m_num;
MyClass() { m_num = 1;}
const MyClass operator+(const MyClass& mcls)
{
MyClass temp;
temp = m_num + mcls.m_num;
return temp;
}
}
假設我們重載=運算符。
所以以我寫的代碼為例,將參數發送到operator + overload函數並不是通過引用而且也不是通過引用返回MyClass的實例也可以工作但我在很多例子中都看到它傳遞並通過引用返回我會想知道這背后是否存在某種原因,或者僅僅是某種類型的約定還是偏好?
如果您的實際問題是關於通過const引用傳遞,那么請參閱為什么通過const引用而不是通過值? ,否則繼續閱讀。
您不應該返回對局部變量的引用 。 局部變量超出范圍,留下對垃圾的引用。 C ++運算符重載指南聲明operator+
不應修改任何操作數並從兩個參數返回一個新值。
const MyClass operator+(const MyClass& mcls) const
{
MyClass temp = *this;
temp.m_num += mcls.m_num;
return temp;
}
因此,返回副本非常重要。
另一方面,關於operator=
,您確實想要返回引用,因為它是復制賦值運算符 。 例如:
MyClass& MyClass::operator=(const MyClass &rhs) {
// Check for self-assignment!
if (this == &rhs) // Same object?
return *this; // Yes, so skip assignment, and just return *this.
... // Deallocate, allocate new space, copy values...
return *this;
}
你想將rhs
復制到*this
並返回一個引用:
[...]支持安全合理的操作員鏈接。 (通過返回*這樣做。)
如果你的功能是:
MyClass operator+(const MyClass *mcls)
那么代碼a + b
就不會編譯。 你必須寫a + &b
可怕a + &b
。
將運營商作為以下人員是有效的:
MyClass operator+(MyClass mcls)
從概念上講,此代碼創建了mcls
的額外副本,因為它是按值傳遞的。 如果這個副本實際上可以移出,或者省略或者其他的優化,那么這是一個很好的風格。 否則, const MyClass &
版本是一個很好的優化(有時是一個過早的!),以避免這種潛在的額外副本。
請注意,這兩個都應該是const
(即函數 - 而不是返回值),因為它們不會修改*this
。 並且對於operator+
,將其視為非成員函數被認為是更好的風格
operator+
不應返回引用的原因是人們期望+
接受兩個輸入並生成新輸出。 如果代碼是c = a + b;
那么我們期望a
保持不變。 你必須在一個保存總和的地方創建一個新對象,並返回它。 當我們按值返回時,這是一個臨時對象,通常編譯器會忽略它並將結果直接寫入c
。
對於operator+=
,修改*this
並返回對*this
的引用是正確的。 實現operator+
一種好方法實際上就是在第一個操作數上調用operator+=
(當按值傳遞時)。
嚴格地說,不需要通過引用或通過常量引用傳遞:代碼將使用值傳遞。 但是,對於大多數效率低下的運算符而言,因為按值傳遞需要復制整個對象 - 這是您通過引用傳遞時要避免的。
返回值也是如此:通常,您應該按值返回。 但是,此規則有一個值得注意的例外:所有復合賦值運算符都需要通過引用返回,因為它們返回(*this)
。
使用指針而不是引用是不可能的,但出於不同的原因:C ++要求運算符按類型與特定簽名兼容; 引用與相應類型的值類型兼容,但指針不兼容。 如果定義了一個帶指針的運算符的重載,則在處理值時C ++不會使用運算符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.