2012-01-09 3 views
0


У меня есть небольшой вопрос о примере кода в C++.Создание объекта в C++

vector<Cat> v; 
Cat c; 
v.push_back(c); 
Cat d = v[0]; 

В этом фрагменте кода, сколько объектов создано?

+6

Это домашнее задание? –

+2

Вас интересует общее количество объектов или просто количество объектов «Cat»? Например, вы хотите считать 'v' как объект или просто объекты' Cat' в * 'v'? –

+4

Невозможно сказать. Что делает конструктор по умолчанию 'Cat'? Он строит другие объекты? Может ли это сделать исключение? Может ли он вызвать 'std :: exit()'? Как насчет конструктора копии 'Cat'? Что оно делает? Как насчет реализации 'std :: vector'? Возможно ли, что любое из распределений, которое оно пытается, не сработает? Нужно также учитывать подобъекты? –

ответ

1

По крайней мере, три:

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 делать ...?)

1

Добавьте регистрацию в конструктор 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

Обратите внимание, что при определенных условиях компилятор волен удалить куски кода, которые ничего не делают. Поэтому некоторые копии могут быть удалены. С гипотетическим очень агрессивным компилятором он может заметить, что ваш код ничего не делает и полностью исключает любые такие конструкции. Поскольку мои конструкторы теперь меняют результат, компилятор менее свободен для удаления вызовов.

Смежные вопросы