У меня есть небольшой вопрос о примере кода в C++.Создание объекта в C++
vector<Cat> v;
Cat c;
v.push_back(c);
Cat d = v[0];
В этом фрагменте кода, сколько объектов создано?
У меня есть небольшой вопрос о примере кода в C++.Создание объекта в C++
vector<Cat> v;
Cat c;
v.push_back(c);
Cat d = v[0];
В этом фрагменте кода, сколько объектов создано?
По крайней мере, три:
vector<Cat> v;
Cat c; // default construction
v.push_back(c); // copy construction of v[0] from c
Cat d = v[0]; // copy construction of d from v[0]
Edit: Обратите внимание, что я рассчитывать только Cat
объекты здесь, потому что это не имеет смысла спрашивать, сколько объектов в общем созданы, потому что это будет реализация конкретных (как реализуется std::vector
Что Cat
делать ...?)
Добавьте регистрацию в конструктор Cat и проверить его самостоятельно:
class Cat
{
Cat()
{
std::cout<<"Constructing a Cat"<<std::endl;
}
Cat(const Cat & cat)
{
std::cout<<"Copy Constructing a Cat"<<std::endl;
}
};
Вот что я получаю: http://codepad.org/Pzs9kOlH
Обратите внимание, что при определенных условиях компилятор волен удалить куски кода, которые ничего не делают. Поэтому некоторые копии могут быть удалены. С гипотетическим очень агрессивным компилятором он может заметить, что ваш код ничего не делает и полностью исключает любые такие конструкции. Поскольку мои конструкторы теперь меняют результат, компилятор менее свободен для удаления вызовов.
Это домашнее задание? –
Вас интересует общее количество объектов или просто количество объектов «Cat»? Например, вы хотите считать 'v' как объект или просто объекты' Cat' в * 'v'? –
Невозможно сказать. Что делает конструктор по умолчанию 'Cat'? Он строит другие объекты? Может ли это сделать исключение? Может ли он вызвать 'std :: exit()'? Как насчет конструктора копии 'Cat'? Что оно делает? Как насчет реализации 'std :: vector'? Возможно ли, что любое из распределений, которое оно пытается, не сработает? Нужно также учитывать подобъекты? –