Code Bye

创建一个vector,为什么会调用拷贝构造函数

如下代码,拷贝构造函数为什么会调用3次?
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
class A
{
public:
	A(){}
	A(const A &a) { cout << "拷贝构造" << endl; }
};
int main()
{
	vector<A> va(3);
	return 0;
}
解决方案

2

经测试,没有调用复制构造函数,lz该换换编译器了…

4

引用:

经测试,没有调用复制构造函数,lz该换换编译器了…

这个依赖STL的实现

5

http://en.cppreference.com/w/cpp/container/vector/vector
注意重载 (2) 和 (3)
C++11 前,使用重载2,使用默认构造函数构造T并传入构造函数,构造函数中执行复制
C++11 后,使用重载3,对每个元素调用默认构造函数来构造

5

Primer上说Vector会先调用一次默认构造函数,然后调用n次复制构造函数,但VS2010测试是分别调用了n次默认构造函数和n次复制构造函数,具体情况可能和编译器有关系吧
这么做主要是为了初始化容器内的对象,语言要求容器内的对象必须初始化的,假如是int那就初始化为0就好
但假如是你本人定义的对象,原因是编译器不知道你对象内放了什么,所以只能调用默认构造函数和复制构造函数的方法来完成了,例如你的默认构造函数里给一个成员变量赋值为5,那编译器不可能一次初始化多个这样的变量的,原因是存放好多个5的内存空间是不连续的,不过也许真的有这么智能的编译器,那样就不用调用函数了,直接用底层语句就完成了

6

题主编译器STL实现中是先构造出3个对象,然后再复制到容器中

10

引用:
Quote: 引用:

http://en.cppreference.com/w/cpp/container/vector/vector
注意重载 (2) 和 (3)
C++11 前,使用重载2,使用默认构造函数构造T并传入构造函数,构造函数中执行复制
C++11 后,使用重载3,对每个元素调用默认构造函数来构造

英文不太好,能从STL的源码角度说说基本原理吗?实现一个数组就要一定要调用拷贝构造函数的思想是什么?

看STL实现啊,可以先使用默认构造一个对象,然后copy N次。
也可以直接构造出N个对象。

2

运行过,没执行复制构造函数

4

引用:
Quote: 引用:
Quote: 引用:

http://en.cppreference.com/w/cpp/container/vector/vector
注意重载 (2) 和 (3)
C++11 前,使用重载2,使用默认构造函数构造T并传入构造函数,构造函数中执行复制
C++11 后,使用重载3,对每个元素调用默认构造函数来构造

英文不太好,能从STL的源码角度说说基本原理吗?实现一个数组就要一定要调用拷贝构造函数的思想是什么?

看STL实现啊,可以先使用默认构造一个对象,然后copy N次。
也可以直接构造出N个对象。

重载(3)明确说了No copies are made。

2

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

http://en.cppreference.com/w/cpp/container/vector/vector
注意重载 (2) 和 (3)
C++11 前,使用重载2,使用默认构造函数构造T并传入构造函数,构造函数中执行复制
C++11 后,使用重载3,对每个元素调用默认构造函数来构造

英文不太好,能从STL的源码角度说说基本原理吗?实现一个数组就要一定要调用拷贝构造函数的思想是什么?

看STL实现啊,可以先使用默认构造一个对象,然后copy N次。
也可以直接构造出N个对象。

重载(3)明确说了No copies are made。

总不能一下子让C++11 之前的编译器都消失了吧。

2

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

1

标准容器入容器就是要调用构造方法的,这是由标准库决定的

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明创建一个vector,为什么会调用拷贝构造函数