一、初始化 :用於為變量指定初始值,對於類而言,指的是構造函數。
備注:如果聲明中有初始化,那麼它其實是定義。
例如: externdouble pi = 0;
此時pi是定義,所以如果這樣用的話會出錯:
extern double pi = 0;
extern double pi = 1; // 2個extern且初始化
默認構造函數(default constructor):指可以“無需任何引數就可被調用者”,這樣的一個構造函數如果不是沒有任何參數,就是每個參數都有默認值。通常當你要定義對象數組時,就會需要一個默認構造函數。
拷貝構造函數(copy constructor):指以某個對象作為另一個同型對象的初值。它最重要的用途是用來定義以傳值的方式來傳遞和傳回對象,換就話說,pass-by-value就是調用拷貝構造函數的同義詞。
例子:
class String {
public:
String(); // default constructor
String(const String & rhs); // copy constructor
public:
String& operator=(const String& rhs) {
if (this == &rhs) return *this;
delete [] data;
data = new char[strlen(rhs.data] + 1];
strcpy(data, rhs.data);
retrun *this;
}
...
private:
char *data;
};
String s1; // 默認構造函數
String s2(s1); // 拷貝構造函數
String s3 = s2; // 拷貝構造函數
二、賦值:簡單地說,賦值發生在當你賦值時。
例如:int i= 0; // 這是初始化
i= 20; //這是賦值
賦值和初始化本質是不同的操作,賦值發生在為已初始化的對象賦予新值的時候,初始化發生對象初次獲得一個值的時候,或者說是在賦值外的所有地方,例如定義、函數返回、參數傳遞和捕獲異常時。
對於int和double這些內置類型來說,賦值和初始化的操作基本上是相同的,簡單的復制一些位而已。
但是對於用戶自定義類型,例如class而言,則是完全不同。實例請參見String類的實現,此時初始化操作就是構造函數,通常處理是申請內存後拷貝;而賦值不同,它是先施放原有內存後再申請新內存,最後拷貝。此時,套用專業術語來說,初始化就是構造函數,賦值就是重載=運算符。