關於C++ 構造函數的那點小事

先列出來c++中所有的構造函數

1、默認構造函數和帶參數的構造函數 我們暫且稱他們爲“普通構造函數” .eg Test(); or Test(int i, ...);

2、拷貝構造函數Test(const Test & t);

3、類型轉換構造函數  Test(int i);

一、普通構造函數

1、這裏我們主要講一下默認構造函數的生命週期:即它什麼時候會出現?

答:通常在一個類中,如果我們沒有給出任何類型的構造函數,那麼這個默認的構造函數就會由編譯器自動生成。

         反之,如果程序員給出了任何一種類型的構造函數,那麼編譯器是不會爲我們生成默認構造函數的(這一點適用於所有構造函數)

看下面這個例子:

#include <iostream>

using namespace std;

class Test
{
public:
	Test(int iCounter);
private:
	int m_iCounter;
};

Test :: Test(int iCounter)
{
	m_iCounter = iCounter;
}

int main()
{
	Test test; 	
	return 0;	
}

由於在類體中,我們給出了一種類型的構造函數,那麼編譯器就不會再幫助我們自動生成默認構造函數了,所以在main函數中,我們想要通過調用默認構造函數的方式來創建一個對象是錯誤的:對‘Test::Test()’的調用沒有匹配的函數

2、改變:

(1)如果我們把普通構造函數放到private裏面,會產生什麼效果?

二、拷貝構造函數

顧名思義,拷貝構造函數就是當你打算用一個已經存在的對象,去找葫蘆畫瓢再創建一個對象時,新對象調用的構造函數.


1、細節

(1)我們做一些有意思的改變:如果我們把拷貝構造函數設置成私有的會怎麼樣?

eg:

class Test
{
public:
	Test();
private:
	Test(const Test & t);
};

在main函數中,我們這樣使用:

int main()
{
	Test t;
	Test t2 = t;

	return 0;
}

編譯,報錯:‘Test::Test(const Test&)’是私有的
是了,我們在類外部,用對象t去拷貝構造t2,這個時候,t2會調用拷貝構造函數,而拷貝構造函數是私有的,在類外部調用是非法的。

所以,把拷貝構造函數設置成私有的效果就是,在類外部不能進行對象的拷貝


三、類型轉換構造函數、

1、細節:

(1)通常有且只有一個參數的構造函數是類型轉換構造函數,但有一個參數的構造函數也可以不是類型轉換構造函數,eg:可以是普通構造函數,甚至拷貝構造函數都是隻有一個構造函數。



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