koala написав:розгляньте ситуацію
MyClass MyClass::operator + ( const MyClass& operand ) const;
...
MyClass a = 1, b = 1, c = a + b;
Тут створюється (для повернення значення з operator +) тимчасовий об'єкт типу MyClass, який здохне одразу після копіювання в c. Тому варто не копіювати значення з нього, а просто перебирати - у вашому випадку це буде (так писати трохи неправильно, але для розуміння поки так)
MyString(MyString&& copy)
{
str = copy.str;
}
І розберіться з модифікатором const - це дуже важлива річ, коли мова йде про посилання.
З const наче розібрався, ось цей запис
MyClass MyClass::operator + ( const MyClass& operand ) const;
значить слідуюче:
Функція повертає об'єкт MyClass, а приймає посилання на інший об'єкт MyClass, дані котрого вона змінювати не може, також ця функція не може змінювати дані поточного класа, до якого вона відноситься.
Я зрозумів
Спочатку, майбуть, створюється C, після чого у об'єкта А викликається operator+, котрий приймає посилання на об'єкт B, після чого він проводить потрібні операції та повертає новий об'єкт MyClass.
Далі у об'єкта C спрацьовує конструктор копіювання(?), котрий копіює дані тимчасового об'єкта в себе, ну типу робиться таким самим, як і тимчасовий об'єкт, котрого ми отримали після виклику operator+.
Ну а потім тимчасовий об'єкт, як ви написали - здихає.
І от в мене два питання, спочатку нубське, котре зародилось під час написання цього поста.
При c=(a+b) у об'єкта C викликається конструктор копіювання, чи operator= ? Чому так?
І якщо ми робимо
MyString(MyString&& copy)
{
str = copy.str;
}
А copy здихає, то це ж значить, що в нього викличеться деструктор, котрий звільний пам'ять, на котру тепер вказує str?
І що за &&? Посилання на посилання? Як це так?
Як компілятор розуміє, коли що викликати: конструктор переміщення, конструктор копіювання, чи operator=?