Я читал книгу Майерса и наткнулся на элемент при возврате по ссылке/указателю против значения. Дело в том, что если наша функция, например, такая:
ClassA& AddSomething(ClassA classA)
{
ClassA tempClassA;
//... do something on tempClassA
return tempClassA;
}
Это не сработает, потому что мы возвращаем ссылку на объект, который был создан в стеке, и теперь, когда функция выполнена, он мертв.
Он дает два решения:
- Использование локального статического ClassA внутри функции. У этого есть свои проблемы, но, по крайней мере, мы можем быть уверены, что объект существует.
Вернуть как объект:
ClassA AddSomething(ClassA classA) { ClassA tempClassA; //... do something on tempClassA return tempClassA; }
Теперь, если я должен сделать:
ClassA obj1;
ClassA obj2 = AddSomething(obj1);
Моя путаница сейчас при выполнении этой строки:
- Создается «копия» tempClassA и передается конструктору копирования ClassA (для инициализации obj2)? ИЛИ
- tempClassA передается конструктору копирования ClassA, потому что конструктор копирования принимает ссылку.
Таким образом, в конструктор копирования передается ссылка на tempClassA (который был создан в стеке внутри функции) или ссылка на копию tempClassA.
Кроме того, у меня есть еще один вопрос: я читал, что если я получу ссылку на локальную переменную функции, в этом случае локальная переменная не будет удалена. Например,
ClassA & classRef = AddSomething(obj1);
В этом случае, если AddSomething() возвращает ссылку, то classRef не будет указывать на удаленную ссылку, потому что локальная переменная будет сохранена. Я правильно это понял?