我的代码类似于这些内容。
class A
{
public:
A(int i) { printf("hello %d\n", i); }
~A() { printf("Goodbye\n"); }
}
std::vector(10, A(10));
我注意到hello打印出来一次。 这似乎意味着向量只为元素分配空间 但不构建它。如何构建10个A对象?
答案 0 :(得分:12)
当您将对象传递给std :: vector时,该对象只构造一次。然后将此对象复制10次。您必须在复制构造函数中执行printf才能看到它。
答案 1 :(得分:6)
你忘记了复制构造函数:
#include <iostream>
#include <vector>
using namespace std;
class A
{
int i;
public:
A(int d) : i(d) { cout << "create i=" << i << endl; }
~A() { cout << "destroy" << endl; }
A(const A& d) : i(d.i) { cout << "copy i=" << d.i << endl; }
};
int main()
{
vector<A> d(10,A(10));
}
输出:
create i=10
copy i=10
copy i=10
copy i=10
copy i=10
copy i=10
copy i=10
copy i=10
copy i=10
copy i=10
copy i=10
destroy
destroy
destroy
destroy
destroy
destroy
destroy
destroy
destroy
destroy
destroy
答案 2 :(得分:3)
A(10)
构造一个临时对象。只有一次。矢量的10个元素是通过 copy-constructor 构建的。因此,如果您定义一个复制构造函数来打印B,那么您将获得10个B。
答案 3 :(得分:1)
定义复制构造函数,你会没事的:
#include <cstdio>
#include <vector>
class A
{
public:
A(int i) { printf("hello %d\n", i); }
~A() { printf("Goodbye\n"); }
A(const A&)
{
printf("copy constructing\n");
}
};
int main()
{
std::vector< A > a( 10, A(5) );
}