如下代码,拷贝构造函数为什么会调用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
这个依赖STL的实现
5
http://en.cppreference.com/w/cpp/container/vector/vector
注意重载 (2) 和 (3)
C++11 前,使用重载2,使用默认构造函数构造T并传入构造函数,构造函数中执行复制
C++11 后,使用重载3,对每个元素调用默认构造函数来构造
注意重载 (2) 和 (3)
C++11 前,使用重载2,使用默认构造函数构造T并传入构造函数,构造函数中执行复制
C++11 后,使用重载3,对每个元素调用默认构造函数来构造
5
Primer上说Vector会先调用一次默认构造函数,然后调用n次复制构造函数,但VS2010测试是分别调用了n次默认构造函数和n次复制构造函数,具体情况可能和编译器有关系吧
这么做主要是为了初始化容器内的对象,语言要求容器内的对象必须初始化的,假如是int那就初始化为0就好
但假如是你本人定义的对象,原因是编译器不知道你对象内放了什么,所以只能调用默认构造函数和复制构造函数的方法来完成了,例如你的默认构造函数里给一个成员变量赋值为5,那编译器不可能一次初始化多个这样的变量的,原因是存放好多个5的内存空间是不连续的,不过也许真的有这么智能的编译器,那样就不用调用函数了,直接用底层语句就完成了
这么做主要是为了初始化容器内的对象,语言要求容器内的对象必须初始化的,假如是int那就初始化为0就好
但假如是你本人定义的对象,原因是编译器不知道你对象内放了什么,所以只能调用默认构造函数和复制构造函数的方法来完成了,例如你的默认构造函数里给一个成员变量赋值为5,那编译器不可能一次初始化多个这样的变量的,原因是存放好多个5的内存空间是不连续的,不过也许真的有这么智能的编译器,那样就不用调用函数了,直接用底层语句就完成了
6
题主编译器STL实现中是先构造出3个对象,然后再复制到容器中
10
看STL实现啊,可以先使用默认构造一个对象,然后copy N次。
也可以直接构造出N个对象。
2
运行过,没执行复制构造函数
4
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
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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
1
标准容器入容器就是要调用构造方法的,这是由标准库决定的