为什么构造函数只被调用一次?

Gre*_*lin 31 c++

考虑以下计划:

class A
{
    public:
    A(int i)
    {
            cout<<"Called"<<endl;
    }
};

int main()
{
    vector<A> v(5,A(1));
    return 0;
}       
Run Code Online (Sandbox Code Playgroud)

我得到了输出:http://ideone.com/81XO6

 Called
Run Code Online (Sandbox Code Playgroud)

为什么即使我们构造5个对象,构造函数也只被调用一次?编译器
如何vector内部处理?

AnT*_*AnT 39

你的班级有两个建设者,你只看其中一个.std::vector通过从您提供的原始元素中复制构造元素来创建元素.为此,在您的示例中,类的copy-constructor 被调用5次.A

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

  • @Mysticial:我不希望任何编译器能够直接使用原始版本.怎么样?元素存储在动态内存块中,在构造原始元素之后分配*.因此,所有5个元素都必须从原始元素中复制. (3认同)

Ed *_*eal 12

它从一行开始被调用一次

vector<A> v(5,A(1)); 
Run Code Online (Sandbox Code Playgroud)

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

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

之后使用复制构造函数.

尝试添加

A(const &A);
Run Code Online (Sandbox Code Playgroud)

到类声明来验证这一点.