歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++ 初始化和賦值辨析

一、初始化 :用於為變量指定初始值,對於類而言,指的是構造函數。
    備注:如果聲明中有初始化,那麼它其實是定義。

    例如: 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類的實現,此時初始化操作就是構造函數,通常處理是申請內存後拷貝;而賦值不同,它是先施放原有內存後再申請新內存,最後拷貝。此時,套用專業術語來說,初始化就是構造函數,賦值就是重載=運算符。

Copyright © Linux教程網 All Rights Reserved