Насколько я знаю, конструктор копирования вызывается в следующих сценариях:
1) Pass by value
2) Return by value
3) When you create and initialize a new object with an existing object
Здесь программа:
#include <iostream>
using namespace std;
class Example
{
public:
Example()
{
cout << "Default constructor called.\n";
}
Example(const Example &ob1)
{
cout << "Copy constructor called.\n";
}
Example& operator=(const Example &ob1)
{
cout << "Assignment operator called.\n";
return *this;
}
~Example()
{
cout<<"\nDtor invoked"<<endl;
}
int aa;
};
Example funct()
{
Example ob2;
ob2.aa=100;
return ob2;
}
int main()
{
Example x;
cout << "Calling funct..\n";
x = funct();
return 0;
}
Вывод:
Вызывается конструктор по умолчанию.
Функция вызова.
Вызывается конструктор по умолчанию.
Вызывается оператор присваивания.
Dtor вызывается
Dtor вызывается
Пожалуйста, исправьте меня, IIRC должна произойти следующая последовательность вызовов:
1) Конструктор x называется
2) Конструктор ob2 называется
3) Функция возвращается и поэтому вызывается конструктор копирования (чтобы скопировать ob2 в неназванную временную переменную i.e funct())
4) Деструктор ob2, называемый
5) Назначьте неназванную временную переменную x
6) Уничтожьте временную переменную i.e вызовите ее деструктор
7) Уничтожьте x i.e вызовите x destructor
Но тогда почему конструктор копирования не вызывается, и также есть только 2 обращения к dtors, тогда как я ожидаю 3.
Я знаю, что компилятор может делать оптимизации, однако, правильно ли я понимаю?
Большое спасибо:)
Привет
Lali