Почему конструктор вызывается только один раз?
Рассмотрим приведенную ниже программу:
class A
{
public:
A(int i)
{
cout<<"Called"<<endl;
}
};
int main()
{
vector<A> v(5,A(1));
return 0;
}
Я получаю вывод: http://ideone.com/81XO6
Called
Почему конструктор вызывается только один раз, даже если мы строим 5 объектов?
Как vector
внутренне обрабатывается компилятором?
Ответы
Ответ 1
В вашем классе есть два конструктора, и вы смотрите только один из них. std::vector
создает свои элементы, копируя их из исходного элемента, который вы предоставили. Для этой цели экземпляр-конструктор класса A
вызывается 5 раз в вашем примере.
Конструктор-копир для A
в вашем примере неявно объявлен и определен компилятором. Если вы этого желаете, вы можете сами заявить и определить. Если вы что-то напечатаете, вы увидите, что он вызывается не менее 5 раз.
Ответ 2
Он вызывается один раз, поскольку строка
vector<A> v(5,A(1));
вызовет конструктор, и строка станет вектор v (5, X);
где X - объект, построенный после вызова конструктора.
После этого используется конструктор копирования.
Попробуйте добавить
A(const &A);
В объявлении класса, чтобы проверить это.