文档详情

初始化及赋值的区别.doc

发布:2017-05-17约1.4千字共2页下载文档
文本预览下载声明
区别说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个新的对象,并且其初值来源于另一个已存在的对象。编译器会区别这两种情况,赋值的时候调用重载的赋值运算符,初始化的时候调用拷贝构造函数。如果类中没有拷贝构造函数,则编译器会提供一个默认的。这个默认的拷贝构造函数只是简单地复制类中的每个成员。 下面看例子。? 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;   }   建议在条件允许的情况下最好在初始化的时候就赋值,而尽量避免用=号赋值了,比如用成员初始化列表来初始化成员数据,不在构造函数里用赋值操作给成员数据.
显示全部
相似文档