Żeby zobaczyć co się tak naprawdę dzieje musisz dodać troszkę więcej kodu
#include <iostream>
#include <vector>
using namespace std;
class Class
{
public:
Class() {
cout << "constructor " << this << endl;
}
Class(const Class &other) {
cout << "copy constructor " << this << endl;
}
Class(Class &&other) {
cout << "move constructor " << this << endl;
}
~Class()
{
cout << "destructor " << this << endl;
}
};
int main()
{
vector<Class>klasa;
std::cout << "Dodnie kopii przez push_back" << std::endl;
klasa.push_back( {} );
std::cout << "Koniec programu" << std::endl;
return 0;
}
Output:
Dodnie kopii przez push_back
constructor 0x7ffce4fb4d3f
move constructor 0x903c20
destructor 0x7ffce4fb4d3f
Koniec programu
destructor 0x903c20
Najpierw tworzysz obiekt tymczasowy przy pomocy konstruktora domyślnego.
Następnie obiekt (jego zawartość) jest przenoszony do wektora z użyciem konstruktora przenoszącego. (Gdybyś użył zmiennej lokalnej zamiast tymczasowej to użyty by został konstruktor kopiujący).
Zmienna tymczasowa jest niszczona (pierwszy destruktor).
I na koniec (po wyjściu z zakresu zmiennej klasa) niszczony jest obiekt wewnątrz wektora.
Żeby uniknąć tworzenia tymczasowego obiektu możesz użyć metody emplace_back. Służy ona do konstrukcji obiektu bezpośrednio wewnątrz kontenera.
#include <iostream>
#include <vector>
using namespace std;
class Class
{
public:
Class() {
cout << "constructor " << this << endl;
}
Class(const Class &other) {
cout << "copy constructor " << this << endl;
}
Class(Class &&other) {
cout << "move constructor " << this << endl;
}
~Class()
{
cout << "destructor " << this << endl;
}
};
int main()
{
vector<Class>klasa;
// Rezerwujemy miejsce aby uniknąć przenoszenia wektora
// w inne miejsce w pamięci
// polecam przetestować również bez tej operacji
klasa.reserve(2);
std::cout << "Dodnie kopii przez push_back" << std::endl;
klasa.push_back( {} );
std::cout << "A teraz czas na emplace_back" << std::endl;
klasa.emplace_back();
std::cout << "Koniec programu" << std::endl;
return 0;
}
Output z programu
Dodnie kopii przez push_back
constructor 0x7ffe2fd8673f
move constructor 0x10f6c20
destructor 0x7ffe2fd8673f
A teraz czas na emplace_back
constructor 0x10f6c21
Koniec programu
destructor 0x10f6c20
destructor 0x10f6c21