У меня есть некоторые проблемы с пониманием конструкторов экземпляров на C++, я надеюсь, что кто-то может мне помочь.Copy constructor - Понимание проблем
Насколько я знаю, конструктор копирования вызывается (в частности, когда-либо), когда функция возвращает экземпляр класса.
#include <iostream>
using namespace std;
class Test
{
int a;
public:
Test(int a) : a(42)
{}
// Copy constructor
Test(const Test& other)
{
cout << "copy constructor" << endl;
}
};
Test test_function()
{
Test a(3);
return a;
}
int main()
{
test_function();
return 0;
}
Итак, если я выполняю этот код, конструктор копирования никогда не будет вызван? Зачем? И какой объект, чем возвращен?
Кроме того, если я заменить строку
test_function();
к
Test b = test_function();
копия конструктора не является ни называют - почему нет?
Заранее спасибо
Edit: При смене функции на:
Test test_function()
{
Test a(3);
Test b(34);
if (4 < 2)
return a;
else
return b;
}
можно увидеть вызов конструктора копирования, так как компилятор не может использовать РВО.
Это оптимизация под названием «Именованная оптимизация возвращаемого значения», для краткости NRVO. –
В этом примере есть один объект Test, для просмотра copyconstructors в действии вам нужно как минимум 2 объекта. Как и тест b = test_function() –
Компилятор правильно отмечает, что вы не используете возвращаемое значение (ни в одном случае), и оно оптимизирует копию. Copy elision - единственная оптимизация, которая позволяет изменять наблюдаемое поведение программы. – jrok