初始化和赋值的区别

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

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


  建议在条件允许的情况下最好在初始化的时候就赋值,而尽量避免用=号赋值了,比如用成员初始化列表来初始化成员数据,不在构造函数里用赋值操作给成员数据.
  • 19
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
初始化列表和赋值C++中是两种不同的方式来初始化类成员变量的方法。 初始化列表是在构造函数的定义中使用冒号(:)后面跟随一系列成员初始化的语法。它可以在对象被创建时直接初始化成员变量,而不需要使用赋值操作符进行赋值。使用初始化列表可以提供更高效的方式来初始化成员变量,特别是对于非内置类型的成员变量来说。 赋值则是在构造函数的函数体内,使用赋值操作符(=)将初始值赋给成员变量。它是在对象已经被创建后再进行的操作。在构造函数中使用赋值操作符进行赋值初始化可以更灵活地进行成员变量的初始化,特别是在需要根据特定条件进行不同的初始化操作时。 使用初始化列表的方式可以提高代码的效率,特别是当类中存在较多成员变量时。而使用赋值操作符进行赋值初始化则更灵活,可以根据需要进行条件判断和额外的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [构造函数初始列表与体内赋值辨析](https://blog.csdn.net/u011420067/article/details/52464958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值