background image

C

   ++初始化与赋值

 

 

 

 先来个区别说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个

 

新的对象,并且其初值来源于另一个已存在的对象。编译器会区别这两种情 况,赋值的
时候调用重载的赋值运算符,初始化的时候调用拷贝构造函数。如果类中没有拷贝构造函

 

数,则编译器会提供一个默认的。这个默认的拷贝构造函数只是 简单地复制类中的每个
成员。 下面看例子。   

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 = """";