c++中的構造函數和拷貝構造函數

  c++的類有六個默認成員函數,我今天介紹其中的兩個,一個是構造函數另一個是拷貝構造函數。

  構造函數用於當類的對象被創建時,給它分配內存空間,並且由編譯器自動調用構造函數對類對象進行初始化工作。

  構造函數的函數名與類名相同,沒有返回類型。下面是一個例子:

class String
{
public:
	String()
	{
	}
private:
	char* _pStr;
}

  這個時候String就是我們String類的構造函數,當然它現在什麼都沒有做。

  構造函數可以對類對象這樣進行初始化:

String(const char* pStr = "")
		:_pStr(new char[strlen(pStr) + 1])
	{
		strcpy(_pStr, pStr);
	}

  這幾行代碼對類對象進行了初始化。首先由函數接收一個參數(假如沒有給參數那麼缺省爲“”,而且缺省的構造函數只能有一個),後面冒號後面的是初始化列表,初始化列表以冒號開始,中間用逗號隔開,每個成員只能出現一次,初始化的順序也要按照成員定義的順序。在上面的例子中我們給成員初始化了一塊空間,並且在函數內部調用strcpy函數把字符串的內容也拷貝進去了。

  當然你的構造函數可以沒有參數,讓它在函數內部進行初始化,也可以通過初始化列表進行初始化。

  比如這樣:

class Complex
{
public:
        Complex(double real = 0.0, double p_w_picpath = 0.0)
        :_real(real),
        _p_w_picpath(p_w_picpath)
        {
        }
private:
	double _real;
	double _p_w_picpath;
}

或者這樣:

class Complex
{
public:
        Complex(double real = 0.0, double p_w_picpath = 0.0)
        {
           _real=real;
           _p_w_picpath=p_w_picpath;
        }
private:
	double _real;
	double _p_w_picpath;
}

  假如你的類沒有顯示的定義一個構造函數,那麼編譯器會給你生成一個。


  下面介紹拷貝構造函數。拷貝構造函數是一種特殊的構造函數,函數名也和類名是一樣的,它的唯一的一個參數是本類型的一個引用變量。當然,參數最好要聲明爲const,起到一個保護的作用。

  那麼什麼時候會調用拷貝構造函數呢?當用一個已初始化過了的自定義類類型對象去初始化另一個新構造的對象的時候,拷貝構造函數就會被自動調用。也就是說,當類的對象需要拷貝時,拷貝構造函數將會被調用。以下情況都會調用拷貝構造函數:

① 當我們要用一個對象去初始化另一個對象時。
② 當函數的參數爲類的對象時。
③ 函數的返回值是類的對象。

  下面我們舉一個例子:

	String(const char* pStr = "")
		:_pStr(new char[strlen(pStr) + 1])
	{
		strcpy(_pStr, pStr);
	}

	String(const String& s)
	{
		String strTemp(s._pStr);
		std::swap(_pStr, strTemp._pStr);
	}

  在這個例子中,上面的是構造函數,下面的是拷貝構造函數。

  如上文所說,它的參數是const類對象的一個引用變量,在函數內部對新的類對象進行了初始化。假如我們不顯式的定義拷貝構造函數,那麼編譯器給我們的會是一個進行淺拷貝的函數。那麼在我們進行清理,把我們申請的空間進行釋放的時候,就會產生問題。所以我們在寫程序的時候要儘量顯顯式的定義構造函數和拷貝構造函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章