- 1、本文档共2页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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; }
建议在条件允许的情况下最好在初始化的时候就赋值,而尽量避免用=号赋值了,比如用成员初始化列表来初始化成员数据,不在构造函数里用赋值操作给成员数据.
您可能关注的文档
最近下载
- 神经源性膀胱评估和治疗方法.pptx VIP
- 万达广场购物中心商业氛围店铺一店一色设计必看指南.pdf VIP
- 2015届高考文综浙江省教育考试院测试样卷.doc VIP
- 马步冲拳(教案)-2021-2022学年体育一年级下册.docx
- 《压力管道元件制造许可规则》 压力管道元件制造许可规则.doc
- 非煤矿矿山企业基本情况登记表企业名称.doc VIP
- R410A安全技术说明书MSDS-china.PDF
- 人教A版高中数学必修第二册精品课件 第7章 复数 7.2.2 复数的乘、除运算.ppt VIP
- 2024年福建统招专升本《政治》知识考点汇总.pdf
- 新译林版英语八年级上册期中选择题精选含答案.doc VIP
文档评论(0)