32

考虑以下程序:

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在内部处理?

4

2 回答 2

40

你的类有两个构造函数,你只看其中一个。通过从您提供的原始元素复制构造它们来std::vector创建其元素。为此,在您的示例中,类的复制构造函数被调用了 5 次。A

您示例中的复制构造函数A由编译器隐式声明和定义。如果您愿意,您可以自己声明和定义它。如果你从中打印一些东西,你会看到它至少被调用了 5 次。

于 2012-07-22T06:33:19.380 回答
12

自线路以来,它被调用一次

vector<A> v(5,A(1)); 

将调用构造函数,该行变为向量 v(5,X);

其中 X 是调用构造函数后构造的对象。

之后使用复制构造函数。

尝试添加

A(const &A);

到类声明来验证这一点。

于 2012-07-22T06:33:40.067 回答