نوشتن operator بالا بدون & یک مشکل اساسی داره اونم این که کپی از کلاس برگشت داده میشد که باعث میشه
عبارت هایی به این شکل درست کار نکنن
a += b += c ;
مثال زیر رو ببینید این جا ما انتظار داریم که مقدار ۱۵ بشه ولی ۶ چاپ میشه
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
A(int val):
num(val)
{}
A operator +=(const A& other)
{
this->num += other.num;
return *this;
}
int num;
};
int main( )
{
A a(2);
A b(4);
A c(9);
( a += b ) += c ;
std::cout<<a.num;
}
مثال بالا علاوه بر این که جواب درستی به ما نمیده از نظر زمان اجرا هم اصلا بهینه نیست چون هر بار که += اجرا میشه یک کپی بی مورد هم انجام میشه و مقدار کپی شده برگشت داده میشه .
نکته : برای سرعت بیشتر بهتره که از move-semantic و prefect forwarding هم برای نوشتن operator ها استفاده کنین