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

srxumin 2016-06-25 09:53:34
如下代码,拷贝构造函数为什么会调用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;
}
...全文
436 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 10 楼 xsklld 的回复:
[quote=引用 8 楼 akirya 的回复:] [quote=引用 5 楼 srxumin 的回复:] [quote=引用 4 楼 iyomumx 的回复:] http://en.cppreference.com/w/cpp/container/vector/vector 注意重载 (2) 和 (3) C++11 前,使用重载2,使用默认构造函数构造T并传入构造函数,构造函数中执行复制 C++11 后,使用重载3,对每个元素调用默认构造函数来构造
英文不太好,能从STL的源码角度说说基本原理吗?实现一个数组就要一定要调用拷贝构造函数的思想是什么?[/quote] 看STL实现啊,可以先使用默认构造一个对象,然后copy N次。 也可以直接构造出N个对象。[/quote] 重载(3)明确说了No copies are made。[/quote] 总不能一下子让C++11 之前的编译器都消失了吧。
xskxzr 2016-07-06
  • 打赏
  • 举报
回复
引用 8 楼 akirya 的回复:
[quote=引用 5 楼 srxumin 的回复:] [quote=引用 4 楼 iyomumx 的回复:] http://en.cppreference.com/w/cpp/container/vector/vector 注意重载 (2) 和 (3) C++11 前,使用重载2,使用默认构造函数构造T并传入构造函数,构造函数中执行复制 C++11 后,使用重载3,对每个元素调用默认构造函数来构造
英文不太好,能从STL的源码角度说说基本原理吗?实现一个数组就要一定要调用拷贝构造函数的思想是什么?[/quote] 看STL实现啊,可以先使用默认构造一个对象,然后copy N次。 也可以直接构造出N个对象。[/quote] 重载(3)明确说了No copies are made。
百灵工作室 2016-07-06
  • 打赏
  • 举报
回复
标准容器入容器就是要调用构造方法的,这是由标准库决定的
赵4老师 2016-07-06
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
liuxing9345 2016-07-03
  • 打赏
  • 举报
回复
运行过,没执行复制构造函数
  • 打赏
  • 举报
回复
引用 5 楼 srxumin 的回复:
[quote=引用 4 楼 iyomumx 的回复:] http://en.cppreference.com/w/cpp/container/vector/vector 注意重载 (2) 和 (3) C++11 前,使用重载2,使用默认构造函数构造T并传入构造函数,构造函数中执行复制 C++11 后,使用重载3,对每个元素调用默认构造函数来构造
英文不太好,能从STL的源码角度说说基本原理吗?实现一个数组就要一定要调用拷贝构造函数的思想是什么?[/quote] 看STL实现啊,可以先使用默认构造一个对象,然后copy N次。 也可以直接构造出N个对象。
paschen 版主 2016-06-26
  • 打赏
  • 举报
回复
楼主编译器STL实现中是先构造出3个对象,然后再复制到容器中
flying_music 2016-06-26
  • 打赏
  • 举报
回复
Primer上说Vector会先调用一次默认构造函数,然后调用n次复制构造函数,但VS2010测试是分别调用了n次默认构造函数和n次复制构造函数,具体情况可能和编译器有关系吧 这么做主要是为了初始化容器内的对象,语言要求容器内的对象必须初始化的,如果是int那就初始化为0就好 但如果是你自己定义的对象,因为编译器不知道你对象内放了什么,所以只能调用默认构造函数和复制构造函数的方法来完成了,比如你的默认构造函数里给一个成员变量赋值为5,那编译器不可能一次初始化多个这样的变量的,因为存放好多个5的内存空间是不连续的,不过也许真的有这么智能的编译器,那样就不用调用函数了,直接用底层语句就完成了
srxumin 2016-06-26
  • 打赏
  • 举报
回复
引用 4 楼 iyomumx 的回复:
http://en.cppreference.com/w/cpp/container/vector/vector 注意重载 (2) 和 (3) C++11 前,使用重载2,使用默认构造函数构造T并传入构造函数,构造函数中执行复制 C++11 后,使用重载3,对每个元素调用默认构造函数来构造
英文不太好,能从STL的源码角度说说基本原理吗?实现一个数组就要一定要调用拷贝构造函数的思想是什么?
iyomumx 2016-06-25
  • 打赏
  • 举报
回复
http://en.cppreference.com/w/cpp/container/vector/vector 注意重载 (2) 和 (3) C++11 前,使用重载2,使用默认构造函数构造T并传入构造函数,构造函数中执行复制 C++11 后,使用重载3,对每个元素调用默认构造函数来构造
srxumin 2016-06-25
  • 打赏
  • 举报
回复
c++ primer书上说的 我试了一下,vs2015不会调用,dev c++是会调用的
  • 打赏
  • 举报
回复
引用 1 楼 dustpg 的回复:
经测试,没有调用复制构造函数,lz该换换编译器了...
这个依赖STL的实现
dustpg 2016-06-25
  • 打赏
  • 举报
回复
经测试,没有调用复制构造函数,lz该换换编译器了...

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧