我对C ++中的代码示例有一点疑问。
vector<Cat> v;
Cat c;
v.push_back(c);
Cat d = v[0];
在这段代码中,创建了多少个对象?
答案 0 :(得分: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]
编辑:请注意,我这里只计算Cat
个对象,因为询问创建了多少个 对象是没有意义的,因为这将是特定于实现的(如何已std::vector
已实施?Cat
做了什么?...)
答案 1 :(得分: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
请注意,在某些情况下,编译器可以自由删除不执行任何操作的代码块。因此可能会删除一些副本。使用假设的非常激进的编译器,它可能会注意到您的代码没有完成任何操作,并完全删除任何此类构造。由于我的构造函数现在更改输出,因此编译器不太可以自由删除对它们的调用。