Когда вызывается [abc e = a + b], конструктор копирования не вызывается.Почему конструктор копирования не вызывается, если перегруженные операторы + и = возвращаются по значению в следующем случае?
class abc{
int i;
public:
abc()
{
i = 10;
cout<<"constructor"<<endl;
}
abc(const abc &a)
{
cout<<"copy constructor"<<endl;
i = a.i;
}
abc operator=(const abc &a)
{
cout<<"operator="<<endl;
abc temp;
temp.i = a.i;
return temp;
}
abc operator+(abc& a)
{
cout <<"Operator+ called"<<endl;
abc temp;
temp.i = i+a.i;
return temp ;
}
};
int main()
{
abc a,b;
cout <<"----------------------------------------------"<<endl;
a = b;
cout <<"----------------------------------------------"<<endl;
abc c = a;
cout <<"-----------------------------------------------"<<endl;
abc d(a);
cout <<"-------------------------------------------"<<endl;
**abc e = a+b;**
}
Однако, если операторы перегрузки методы заменяются следующими методами, которые возвращают ссылки на объект класса аЬс, конструктор копирования вызывается.
abc& operator=(const abc &a)
{
cout<<"operator="<<endl;
i = a.i;
return *this;
}
abc& operator+(const abc& a)
{
cout <<"Operator+ called"<<endl;
i = i+a.i;
return *this ;
}
Может кто-нибудь объяснить, почему это происходит?
Возможный дубликат [Не является оптимизацией возвращаемого значения (RVO) ошибка?] (Http://stackoverflow.com/questions/3905869/isnt-return-value-optimization-rvo-a-bug) – iammilind
плохой класс имя. вы можете назвать это 'MyClass',' TestClass' или некоторые другие имена, но не 'abc', особенно когда ваше имя переменной' a' 'b' и' c'. – abcdabcd987