Ссылки на C++ меня сбивают с толку. :)
Основная идея заключается в том, что я пытаюсь вернуть объект из функции. Я хотел бы сделать это без возврата указателя (потому что тогда мне пришлось бы вручную 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&
, потому что это всегда приводит к уничтожению переменной до того, как она будет возвращена. - Конструктор копирования, кажется, участвует только тогда, когда я возвращаю существующую переменную. При возврате переменной, созданной в строке возврата, она никогда не вызывается.
- Когда я присваиваю результат существующей переменной, деструктор также всегда срабатывает до того, как значение будет возвращено. Кроме того, конструктор копирования не вызывается, но целевая переменная получает значения члена объекта, возвращаемого функцией.
Эти результаты настолько противоречивы, что я чувствую себя совершенно сбитым с толку. Итак, что ТОЧНО здесь происходит? Как мне правильно построить и вернуть объект из функции?