Ссылки на С++ меня озадачивают.:)
Основная идея заключается в том, что я пытаюсь вернуть объект из функции. Я бы хотел сделать это, не возвращая указатель (потому что тогда мне придется вручную delete
его) и без возможности вызова конструктора-копии, если это возможно (для эффективности, естественно добавлено: а также потому, что я задаюсь вопросом, не могу ли я не писать конструктор копирования).
Итак, в целом, вот варианты для этого, которые я нашел:
- Возвращаемый тип функции может быть либо самим классом (
MyClass fun() { ... }
), либо ссылкой на класс (MyClass& fun() { ... }
). - Функция может либо построить переменную в строке возврата (
return MyClass(a,b,c);
), либо вернуть существующую переменную (MyClass x(a,b,c); return x;
). - Код, который принимает переменную, также может иметь переменную любого типа: (
MyClass x = fun();
илиMyClass& x = fun();
) - Код, который получает переменную, может либо создать новую переменную "на лету" (
MyClass x = fun();
), либо назначить ее существующей переменной (MyClass x; x = fun();
)
И некоторые мысли по этому поводу:
- Кажется, плохая идея иметь тип возвращаемого значения
MyClass&
, потому что это всегда приводит к уничтожению переменной до ее возвращения. - Конструктор копирования только кажется вовлеченным, когда я возвращаю существующую переменную. При возврате переменной, построенной в строке возврата, она никогда не вызывается.
- Когда я присваиваю результат существующей переменной, деструктор также всегда запускается до того, как возвращается значение. Кроме того, конструктор копирования не вызван, но целевая переменная получает значения членов объекта, возвращаемого функцией.
Эти результаты настолько непоследовательны, что я чувствую себя совершенно смущенным. Итак, что ТОЧНО происходит здесь? Как правильно построить и вернуть объект из функции?