关于容器vector的复制构造函数问题。

hb5230238 2012-02-22 11:11:21
C++ Primer上的一个课后题,P408,P13.2
vector可以直接初始化:
1。vector<int> v1(42);
而不能使用
2。vector<int> v2 = 42; 这个可以从vector的定义得出什么推断?
答案给的是vector类没有提供公有的复制构造函数。第二个初始化是复制初始化,创建v2时,编译器首先调用接受一个int形参的vector构造函数,创建一个临时vector对象,然后编译器需要使用vector复制构造函数将v2初始化为该临时vector对象的副本。

我的问题是 在第一个里面也还不是先用42创建一个临时对象,再调用复制构造函数,初始化v1嘛?那为什么第二个不行?

我是菜鸟,问的问题非常入门级别,大家不要大笑,但还是可以小笑哈!

谢谢,帮忙看的,帮忙回答的。
Good Luck!
...全文
613 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
williamwong1111 2012-10-27
  • 打赏
  • 举报
回复
顶6楼,正确!这个题目vector<int> v2 = 42;出的就点问题,它分两步,先调用vector类的构造函数,将42隐式转化为vector对象,然后调用复制构造函数,问题就是第一步这个构造函数是声明为explicit的,错误就出在这第一步了。
pengzhixi 2012-02-23
  • 打赏
  • 举报
回复
去 看看explicit的作用
晨星 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hb5230238 的回复:]
引用 6 楼 steedhorse 的回复:
哪里看来的答案啊?这个答案有问题。
vector当然有public的复制构造函数。
第二个之所以不行,是因为vector的那个接受int的单参构造函数是explicit的,从而禁止了从int到vector的隐式转换,而只允许像第一种那样的显式构造。

各位可以试下,就是这个朋友说的原因。但最后一句话(只允许像第一种那样的显式构造)是错误的。
……
[/Quote]
我是说当使用这个单独一个int参数的构造函数时,只能像第一种那么使用。
hb5230238 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 steedhorse 的回复:]
哪里看来的答案啊?这个答案有问题。
vector当然有public的复制构造函数。
第二个之所以不行,是因为vector的那个接受int的单参构造函数是explicit的,从而禁止了从int到vector的隐式转换,而只允许像第一种那样的显式构造。
[/Quote]
各位可以试下,就是这个朋友说的原因。但最后一句话(只允许像第一种那样的显式构造)是错误的。
第一种情况是以42个0元素的容器。
hb5230238 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 redillosion 的回复:]
vector<int> v1(42);中的42相当于调用vector<int>的构造函数直接初始化v1,vector<int> v2 = 42;右边用42调用构造函数创建一个vector<int>临时对象,赋值操作符=的通常定义是将右操作数的副本保存到左操作数,返回左操作数的引用,在复制右操作数到左操作数时,是调用复制构造函数实现的,这就好比sort函数对其调用者要求必须提供<操作符一样
[/Quote]
2L说的很正确,vector<int> v1(42); // 表示42个元素,每个元素的值为0.
hb5230238 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hairetz 的回复:]
http://baike.baidu.com/view/1266959.htm


调用拷贝构造函数的情形
  在C++中,下面三种对象需要调用拷贝构造函数:
  1) 一个对象以值传递的方式传入函数体;
  2) 一个对象以值传递的方式从函数返回;
  3) 一个对象需要通过另外一个对象进行初始化;

你的例子2就命中条件3,一个对象需要通过另外一个对象进行初始化;

而例……
[/Quote] C++Primer上写了5个调用拷贝构造函数的情形:
4) 初始化顺序容器中的元素。
5) 根据元素初始化列表初始化数组元素。
晨星 2012-02-22
  • 打赏
  • 举报
回复
哪里看来的答案啊?这个答案有问题。
vector当然有public的复制构造函数。
第二个之所以不行,是因为vector的那个接受int的单参构造函数是explicit的,从而禁止了从int到vector的隐式转换,而只允许像第一种那样的显式构造。
redillosion 2012-02-22
  • 打赏
  • 举报
回复
vector<int> v1(42);中的42相当于调用vector<int>的构造函数直接初始化v1,vector<int> v2 = 42;右边用42调用构造函数创建一个vector<int>临时对象,赋值操作符=的通常定义是将右操作数的副本保存到左操作数,返回左操作数的引用,在复制右操作数到左操作数时,是调用复制构造函数实现的,这就好比sort函数对其调用者要求必须提供<操作符一样
昵称很不好取 2012-02-22
  • 打赏
  • 举报
回复
好久不见2L,看来工作很忙啊
dulvtianya 2012-02-22
  • 打赏
  • 举报
回复
第一个并没有调用复制构造函数,而是调用带参数的构造函数,
template <typename T>
T Vector<T>::operator ()(int i) const
{
return values[i];
}
  • 打赏
  • 举报
回复
http://baike.baidu.com/view/1266959.htm


调用拷贝构造函数的情形
  在C++中,下面三种对象需要调用拷贝构造函数:
  1) 一个对象以值传递的方式传入函数体;
  2) 一个对象以值传递的方式从函数返回;
  3) 一个对象需要通过另外一个对象进行初始化;

你的例子2就命中条件3,一个对象需要通过另外一个对象进行初始化;

而例子1,只是会调用一个普通的有输入形参int的构造函数,跟拷贝构造无关。

此外,楼主应该了解:
vector<int> v2;
vector<int> v3;
v2=v3;

这种情况是直接调用了=运算符,而不是调用拷贝构造。

昵称很不好取 2012-02-22
  • 打赏
  • 举报
回复
vector<int> v1(42);
----------------------------------------------
这里的42不是用来构造临时对象的,具体什么作用楼主再翻翻书,看看vector的用法

64,746

社区成员

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

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