[英]Return type of operator= - reference or value?
從函數“operator =”返回有什么區別
by reference
by value
? 這兩個版本似乎在下面的示例中產生了正確的結果。
#include <iostream>
using namespace std;
class CComplexNumber{
float m_realPart;
float m_imagPart;
public:
CComplexNumber(float r,float i):m_realPart(r),m_imagPart(i){}
//the following can be also
//CComplexNumber& operator=(const CComplexNumber& orig){
CComplexNumber operator=(const CComplexNumber& orig){
if (this!=&orig){
this->m_realPart=orig.m_realPart;
this->m_imagPart=orig.m_imagPart;
}
return *this;
}
friend ostream& operator<<(ostream& lhs,CComplexNumber rhs){
lhs<<"["<<rhs.m_realPart<<","<<rhs.m_imagPart<<"]"<<endl;
}
};
int main() {
CComplexNumber a(1,2);
CComplexNumber b(3,4);
CComplexNumber c(5,6);
a=b=c;
cout<<a<<b<<c;
return 0;
}
按值返回會返回該對象的副本 。 通過引用返回返回對象本身。
您要使用哪一個取決於您希望如何使用返回的值。 如果要修改它而不影響原始對象(返回后),請按值返回; 否則以引用方式返回。
使用operator = member函數時的約定是通過引用返回。 這允許您鏈接對象的操作:
CComplexNumber a(1,2);
CComplexNumber b(3,4);
(a = b) *= 2; //Assignment of b to a, then scale by 2
現在,在賦值后按值返回, *=
不會修改值a
,因為a的副本將按2縮放。通過引用返回, b
將被分配給a
而a
自身將按2縮放。
返回引用(可變)是最不令人驚訝的,你真正應該選擇的是一個非常常見的操作,它是隱式聲明的。 Reference是默認/隱式定義的返回類型。
例:
A operator=(const A&) = default; // ERROR
const A& operator=(const A&) = default; // ERROR
A& operator=(const A&) = default; // OK
如果您沒有在用戶定義的函數中返回引用,一些編譯器會警告您。
除了令人驚訝的(有時是昂貴的)副本之外,它還避免了切片。
返回const引用可以禁止移動。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.