В других случаях, чтобы свести к минимуму вызовы конструктора копирования, я рекомендую вам определить конструктор перемещения и полностью перенаправить аргументы вашего оператора. Переместить конструктор:
MyClass(MyClass &&input) {std::cout << "Move Constructor\n";}
Идеальный оператор переадресации:
template<typename T>
friend MyClass operator+(T &&lhs,T &&rhs) {return std::forward<T>(lhs);}
При правильных вызовах ваш оператор будет использовать конструктор перемещения вместо конструктора копирования. Например, если вы добавляете объекты, которые выходят из функции, и сразу же сохраняете результат (например, MyClass c=a+b;
вместо MyClass c;c=a+b;
), благодаря RVO вы можете сохранить конструктор копирования.
Допустим, у вас есть функция, которая возвращает экземпляр MyClass
:
MyClass something() {return MyClass();}
Если вы добавите в функцию возвращаемые значения и сохраните их немедленно, например ::
MyClass c=something()+something();
Тогда конструктор копирования не будет задействован.
Я поместил ряд примеров здесь , где я использовал параметр const MyClass&
с operator+
и параметры совершенной пересылки с operator-
. Вы можете видеть, что это имеет значение в последнем примере, но не во всех остальных. Вот почему я сказал «с правильными звонками». Если вам приходится манипулировать объектами, которые можно пересылать подобным образом, это может стоить выстрела.