初始化及赋值的区别.doc

  1. 1、本文档共2页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
初始化及赋值的区别

区别说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个新的对象,并且其初值来源于另一个已存在的对象。编译器会区别这两种情况,赋值的时候调用重载的赋值运算符,初始化的时候调用拷贝构造函数。如果类中没有拷贝构造函数,则编译器会提供一个默认的。这个默认的拷贝构造函数只是简单地复制类中的每个成员。 下面看例子。? c++中初始化和赋值操作差别是很大的。   对于基本数据类型差别不大:   比如:   int?a?=?12;?//?initialization,?copy?0X000C?to?a   a?=?12;?//?assignment,?copy?0X000C?to?a   但是对用户自定义的数据类型比如String 初始化和赋值就差别很大: class?String?{   ?public:   ?String(?const?char?*init?);?//?intentionally?not?explicit!   ?~String();   ?String(?const?String?that?);   ?String?operator?=(?const?String?that?);   ?String?operator?=(?const?char?*str?);   ?void?swap(?String?that?);   ?friend?const?String?//?concatenate   ?operator?+(?const?String?,?const?String??);   ?friend?bool?operator?(?const?String?,?const?String??);   ?//...   ?private:   ?String(?const?char?*,?const?char?*?);?//?computational   ?char?*s_;   };   初始化的构造过程比较简单:先分配一个足够大的空间然后填充上数据:   String::String(?const?char?*init?)?{   ?if(?!init?)?init?=?;   ?s_?=?new?char[?strlen(init)+1?];   ?strcpy(?s_,?init?);   }   析构过程更简单: String::~String()?{?delete?[]?s_;?}   但是如果赋值操作就复杂多了:   String?String::operator?=(?const?char?*str?)?{      ?if(?!str?)?str?=?;      ?char?*tmp?=?strcpy(?new?char[?strlen(str)+1?],?str?);??//?多了中间变量      ?delete?[]?s_; //?多了删除s_;   ?s_?=?tmp;?? //?多一个赋值操作!现在是指向字符的指针,如果是个大对象,效率的差别可想而知.      ?return?*this;   }   建议在条件允许的情况下最好在初始化的时候就赋值,而尽量避免用=号赋值了,比如用成员初始化列表来初始化成员数据,不在构造函数里用赋值操作给成员数据.

文档评论(0)

junjun37473 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档