初始化 赋值 拷贝

来源:互联网 发布:数据库建模工具有哪些 编辑:程序博客网 时间:2024/06/05 08:00

折腾我挺长一段时间,基本挺明白了,先来个区别说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个新的对象,并且其初值来源于另一个已存在的对象。编译器会区别这两种情况,赋值的时候调用重载的赋值运算符,初始化的时候调用拷贝构造函数。如果类中没有拷贝构造函数,则编译器会提供一个默认的。这个默认的拷贝构造函数只是简单地复制类中的每个成员。 下面看例子。

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;  }

  建议在条件允许的情况下最好在初始化的时候就赋值,而尽量避免用=号赋值了,比如用成员初始化列表来初始化成员数据,不在构造函数里用赋值操作给成员数据.

复制构造函数与赋值操作符之间的区别
复制构造函数又称拷贝构造函数,它与赋值操作符间的区别体现在以下几个方面
1.从概念上区分:
复制构造函数是构造函数,而赋值操作符属于操作符重载范畴,它通常是类的成员函数
2.从原型上来区分:
复制构造函数原型 ClassType(const ClassType &); 无返回值
赋值操作符原型 ClassType& operator=(const ClassType &); 返回值为 ClassType 的引用,便于连续赋值操作
3.从使用的场合来区分:
复制构造函数用于产生对象,它用于以下几个地方:函数参数为类的值类型时、函数返回值为类类型时以及初始化语句,例如(示例了初始化语句,函数参数与函数返回值为类的值类型时较简单,这里没给出示例)

ClassType a;         //ClassType b(a);     //调用复制构造函数ClassType c = a;    //调用复制构造函数

而赋值操作符要求‘=’的左右对象均已存在,它的作用就是把‘=’右边的对象的值赋给左边的对象

ClassType e;Class Type f;f = e;              //调用赋值操作符

4.当类中含有指针成员时,两者的意义有很大区别
复制构造函数需为指针变量分配内存空间,并将实参的值拷贝到其中;而赋值操作符它实现的功能仅仅是将‘=’号右边的值拷贝至左值,在左边对象内存不足时,先释放然后再申请。当然赋值操作符必须检测是否是自身赋值,若是则直接返回当前对象的引用而不进行赋值操作

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 坐完月子掉头发怎么办 在香港买到假货怎么办 用气垫脸上浮粉怎么办 不够奶给宝宝吃怎么办 叶插发芽发根后怎么办 多肉植物摊大饼怎么办 英短蓝猫掉毛怎么办 英短蓝猫很凶怎么办 面部打伤怎么办了肿了 朋友欠钱一直拖怎么办 旧车三年不年检怎么办 遇到领导整你该怎么办 皮肤热了就瘙痒怎么办 猫爪子肉垫脏了怎么办 嘴周围干燥起皮怎么办 下嘴唇总是起皮怎么办 上嘴唇老是起皮怎么办 涂口红嘴唇起皮怎么办 上嘴唇干裂起皮怎么办 9岁儿童嘴唇干裂怎么办 上嘴唇干裂烂了怎么办 孕妇脚干的裂开怎么办 小腿皮肤干燥起皮怎么办 秋天脸干燥起皮怎么办 脚上干燥起皮怎么办 脚皮肤干燥起皮怎么办 脚有脚气脱皮又痒怎么办 脚特别干还脱皮怎么办 皮肤干燥起皮怎么办痒 脚一直脱皮怎么办不痒 我的脚老是起皮怎么办? 脚裂了怎么办 小妙招 牛不吃草不倒嚼怎么办 婴儿吸奶乳头痛怎么办 公犬的生殖肿了怎么办 大阴唇一边肿了怎么办 小阴唇比大阴唇大怎么办 儿童9岁外阴白斑怎么办 总想睡觉没精神怎么办 6岁宝宝睡觉打鼾怎么办 4岁儿童睡觉打呼怎么办