直接初始化 与 复制初始化 有何不同?

失落的凡凡 2010-01-03 12:44:43
请看这两种初始化式:
TYPE obj1 = obj2; //复制初始化
TYPE obj1(obj2); //直接初始化
对于这两种初始化式,我一直以为效果是一样的,直到昨天回答问题时跟坛友产生不同意见,回去翻书,书上确实说它们间有微小的区别,但又没有找到具体讲区别在哪地方。所以请教各位坛友,这两种初始化式的区别具体在哪?它们不都是在调用复制构造函数么?
...全文
339 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
pady_pady 2010-01-03
  • 打赏
  • 举报
回复
楼主这么写的话,这两个是一样的,都是调用拷贝 type(const type& );
如果定义成type obj1; 再obj1 = obj2 则调用operator =
而下面那个总是调用拷贝
htz92127 2010-01-03
  • 打赏
  • 举报
回复
JF
qq29992579 2010-01-03
  • 打赏
  • 举报
回复
初始化是直接给内存单元赋值 而复制初始化是用别的内存单元上的数据给这个内存单元赋值
pengzhixi 2010-01-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cattycat 的回复:]
果然高手如云。我一直以为都一样调用拷贝构造函数,加一个explicit到底是什么作用呢。
[/Quote]

去看看隐式转换
cattycat 2010-01-03
  • 打赏
  • 举报
回复
果然高手如云。我一直以为都一样调用拷贝构造函数,加一个explicit到底是什么作用呢。
bxhxb 2010-01-03
  • 打赏
  • 举报
回复
顶,学习了,跑了一下自己更清晰了。
直接初始化调的就是自己的拷贝构造。复制初始化调用的就是以B为形参的构造。
我注销掉前者的拷贝构造,可以编译通过,没有打印,那就是系统生成的默认拷贝构造。
注销掉后者的拷贝构造,也可以编译通过,但就是都调用参数是 const A& 的拷贝构造了。这时可以编译过我觉得主要是A和B的继承关系。
Contemplating 2010-01-03
  • 打赏
  • 举报
回复
学习了:)
失落的凡凡 2010-01-03
  • 打赏
  • 举报
回复
是我打字太慢么?每次都被插……
小桥还不睡么?
失落的凡凡 2010-01-03
  • 打赏
  • 举报
回复
谢谢pengzhixi 呵呵 刚才又去翻了一遍书 刚才我要多等你两分钟的话 那我就省事了
小小攻城师 2010-01-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 milkylove 的回复:]
谢谢pengzhixi  呵呵  刚才又去翻了一遍书  刚才我要多等你两分钟的话  那我就省事了
[/Quote]
楼主可以接着看primer,在第十五章十四章隐式转换和显式转换都有详细的讲解。
(我看的是英文版,中文版应该章节不会变吧)看了之后楼主就会理解了
另外小桥的代码跟primer上的一个练习题差不多,这样写出来就能彻底理解。
小桥果然高手,我当时做那道题根本没有注意。
mstlq 2010-01-03
  • 打赏
  • 举报
回复
直接上代码……
楼主执行一下就应该能明白了……


#include <iostream>
using namespace std;
class B;
class A
{
public:
A(){cout<<"A构造"<<endl;}
A(const A& rhs){cout<<"A(const A& rhs)"<<endl;}
explicit A(const B& rhs){cout<<"A(const B& rhs)"<<endl;}
};

class B: public A
{
};
int main(int argc,char *argv[])
{
B b;
cout<<"华丽的分割线——————————————————"<<endl;
cout<<"下面可以直观查看直接初始化和复制初始化的区别了……"<<endl;
cout<<"执行A aa=b,——";
A aa=b;
cout<<"执行A aa(b),——";
A aaa(b);
system("pause");
return 0;
}
失落的凡凡 2010-01-03
  • 打赏
  • 举报
回复
哦 找到了 区别在于 初始化的参数的类型并不一定是该对象的类型,所以复制初始化不一定是会直接调用复制构造函数,而是创建一个临时对象,再调用复制构造函数。

感谢pady_pady同学热心回答 ,此贴散分,明天晚上结。
pengzhixi 2010-01-03
  • 打赏
  • 举报
回复
当 obj1和obj2的类型不同的时候,而当TYPE里面的单参构造函数声明为explicit时区别就出来了。
失落的凡凡 2010-01-03
  • 打赏
  • 举报
回复
C++Primer中文版第四版42页最下面注解:
当初始化类类型对象时,复制初始化和直接初始化之间的差别是微妙的。

失落的凡凡 2010-01-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pady_pady 的回复:]
楼主这么写的话,这两个是一样的,都是调用拷贝 type(const type& );
如果定义成type obj1; 再obj1 = obj2 则调用operator =
而下面那个总是调用拷贝
[/Quote]

是啊 我也是觉得它们是一样的,你说的我也知道 可书上说它们是有微小差别的。

64,637

社区成员

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

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