构造函数初始化与赋值的区别

Uncle_Chesur 2010-10-25 08:41:51
为什么二者的区别的重要性取决于数据成员的类型
...全文
237 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
無_1024 2010-10-25
  • 打赏
  • 举报
回复
初始化一般只有一次 而赋值有很多次
shen124575130 2010-10-25
  • 打赏
  • 举报
回复
初始化是防止垃圾数据,野指针之类的出现,如果要初始化一个有用的值的话效果是一样的,不过初始化只是最开始的那次赋值,而而赋值可以赋N次
qq120848369 2010-10-25
  • 打赏
  • 举报
回复
定义变量的同时写=就是初始化,使用变量的时候写=就是赋值.
浮世尘雲 2010-10-25
  • 打赏
  • 举报
回复
初始化调用的是构造函数,基于未初始化的内存,构造函数在该空闲内存上塑造对象,该空闲内存不间接引用任何资源是构造函数的假设;

赋值调用的是赋值操作符,基于已存在的对象,如果对象在被赋值之前间接引用了任何资源,那么它在被赋值之前,释放这些资源则是赋值操作符的职责。

对已存在的对象调用构造函数则有可能导致该释放的资源得不到释放;
对未初始化的内存使用赋值操作符则有可能导致无效的释放资源动作。

Aaron_Jerry 2010-10-25
  • 打赏
  • 举报
回复
1楼的就不重复说了。
另外,对于类的对象数据成员来说,出于效率的考虑,最好将其放在初始化列表中,此时只需调用该对象的构造函数。而如果将其放在构造函数体内,则需要调用其默认构造函数 和 赋值操作符。

至于类的内置数据成员,放在初始化列表和体内在效率上没什么差别,看个人喜好吧。
无尽大海 2010-10-25
  • 打赏
  • 举报
回复
定义一个对象,可以调用普通构造函数(初始化)、复制构造函数和赋值操作符。其中对于含有const和&的成员,初始化必须使用初始化列表。
对于为什么二者的区别的重要性取决于数据成员的类型,因为如果使用赋值的话,那么这个对象其实已经初始化过了,接着才进行赋值,而直接初始化的话就没那么多事了。所以,如果是内置类型则两者相差不大,如果是自定义类型,那么赋值就慢下来了!
jrkbjx 2010-10-25
  • 打赏
  • 举报
回复
类里面的成员如果是const类型或引用类型在定义时必须初始化,可以使用冒号语法···
lixianmin 2010-10-25
  • 打赏
  • 举报
回复
定义class A {};

A a;
A b= a;
b= a;


构造函数调用完成后总是生成一个新的对象, 也就是说肯定有新的内存分配;赋值操作是将等号右边对象的数值copy到等号左边的对象身上, 这个过程中不会有新的对象生成(我指的是class A的对象);

理解了这一点,区别它们就很简单了: A a;与A b= a;都是调用构造函数,因为它们分别生成了新的对象a, b;而b= a;这一句,并没有新的对象生成,因此是调用了operator= ()
lovesi3344 2010-10-25
  • 打赏
  • 举报
回复
初始化只有一次

第二次就是赋值了
dingshaofengbinbin 2010-10-25
  • 打赏
  • 举报
回复
赋值可是有讲究的:
比如一个对象A
A a=10;
如果对象A中有这样的构造函数:
A(int i)
{
this.i=i;
}
那么上面的赋值就会成功调用的就是上面的构造函数,如果没有这个构造函数的话,上面的赋值是不会成功的。
A b;
A a=b;//调用拷贝构造函数。
jcwKyl 2010-10-25
  • 打赏
  • 举报
回复
就拿常量和引用来说,这两种是必须要放在初始化列表中的,因为在执行到构造函数体的时候,内存已经分配了,此时常量受到段保护不能写,引用本来就不占内存,这个时候只能作废。
所以c++把这些类型的成员初始化放在初始化列表里面去做。
我的一点理解,不一定对。可以看看一些c++经典书上的说法。

64,637

社区成员

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

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