2012-07-22 219 views
31

考虑下面的程序:为什么构造函数只被调用一次?

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如何在编译器内部处理?

+7

其他的由复制构造函数初始化。 – jxh 2012-07-22 06:31:25

+7

http://ideone.com/lHX5W – 2012-07-22 06:32:04

+1

@Benjamin Lindley:你应该在回答中写下 – nico 2012-07-22 06:33:07

回答

39

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

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

+0

假设不调整大小,是5倍还是4倍?是否使用了原件? – Mysticial 2012-07-22 06:39:02

+3

@Mysticial:我不希望任何编译器能够直接使用原文。怎么样?这些元素存储在一个动态内存块中,该块在创建原始元素后分配。所以,所有5个元素必须从原始复制。 – AnT 2012-07-22 06:41:30

+0

现在我想到了,你是对的,因为它在错误的范围内。 – Mysticial 2012-07-22 06:42:33

12

由于线

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

它被调用一次将调用构造和线变得 矢量v(5,X);

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

之后,使用复制构造函数。

尝试增加

A(const &A); 

到类声明验证这一点。

相关问题