关于vector容器类的复制构造函数

HisinWang 2010-03-14 08:58:21
C++ primer 第四版 P408 习题13.2 原题如下:
下面第一个初始化正确,第二个初始化不能编译。
vector<int> v1(42); //ok
vector<int> v2 = 42; //error
请问你能得出什么结论。

书本的答案是:vector类没有提供公有的复制构造函数。
但我觉得好像有点问题;因为 vector v3(v1); 可以编译,这不就说明提供了公有复制构造函数了吗,我个人觉得
应该是vector类接受单个int型形参的构造函数声明为explicit了。
由于,本人初学C++ ,不敢妄下结论。望高人指点。
为谢!
...全文
438 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangjianping_110 2012-03-06
  • 打赏
  • 举报
回复
谢谢楼上各位的解答,受益匪浅
cs_xm 2011-03-12
  • 打赏
  • 举报
回复
跟楼主同惑同解。原来这经典书也有错啊...
ztenv 版主 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wtq493841534 的回复:]
引用 2 楼 lianshaohua 的回复:
vector<int> v2 = 42; //error

这里和复制构造函数没有关系吧?应该是赋值吧?

偶也是一菜鸟


这里不是赋值。
[/Quote]

明白了。。。。一不小心就over
HisinWang 2010-03-14
  • 打赏
  • 举报
回复
我也这么认为。 呵呵 。谢谢各位啦!!!!
kingstarer 2010-03-14
  • 打赏
  • 举报
回复
lz应该是对的  可能书上笔误或者使用的源码不同
kingstarer 2010-03-14
  • 打赏
  • 举报
回复
explicit vector(size_type _Count)

由于这个explicit的存在导致vector<int> v2 = 42;编译不成功的
2010-03-14
  • 打赏
  • 举报
回复
用括号形式和等号形式初始化对象的区别在于,后者在类型不匹配时,需要先作类型转换,再调用复制构造函数。
2010-03-14
  • 打赏
  • 举报
回复
楼主的想法是对的,vector 用 int 初始化的构造函数是 explicit 的,不能用于隐式转型。
enjolras 2010-03-14
  • 打赏
  • 举报
回复
对=进行操作符重载。operator=()
如果不想让类的实例进行传值操作(包括参数传递和返回值),那么就要将拷贝构造函数设为私有。这样当你进行传值操作的时候,编译器会阻止。
enjolras 2010-03-14
  • 打赏
  • 举报
回复
估计书上的意思是,没有对=进行重载的复制函数,或者是这个函数是私有的。
测试昵称666 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lianshaohua 的回复:]
vector<int> v2 = 42; //error

这里和复制构造函数没有关系吧?应该是赋值吧?

偶也是一菜鸟
[/Quote]

这里不是赋值。
ztenv 版主 2010-03-14
  • 打赏
  • 举报
回复
vector<int> v2 = 42; //error

这里和复制构造函数没有关系吧?应该是赋值吧?

偶也是一菜鸟
测试昵称666 2010-03-14
  • 打赏
  • 举报
回复
在《effective c++》条款5讲到:

第一个是copy构造函数,第二个用到了copy assignment操作符。
也就是在<C++ Primer>前面讲到的直接初始化和复制初始化。

不过按此处我也觉得应该不能把一个容器直接用int赋值吧。。。
并且2个式子表达的含义就不一样,第一个是作为容器大小,第二个就是想给容器赋值了。。。

65,187

社区成员

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

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