考虑以下计划:
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
?
答案 0 :(得分:39)
你的班级有两个施工人员,你只看其中一个。 std::vector
通过从您提供的原始元素中复制来创建其元素。为此,在您的示例中,类A
的复制构造函数被调用了5次。
示例中的A
的复制构造函数由编译器隐式声明和定义。如果你愿意,你可以自己声明和定义它。如果你从中打印出来的东西,你会发现它至少被调用了5次。
答案 1 :(得分:12)
从行
开始调用一次vector<A> v(5,A(1));
将调用构造函数并且行变为 向量v(5,X);
其中X是在调用构造函数后构造的对象。
之后使用复制构造函数。
尝试添加
A(const &A);
到类声明中验证这一点。