先列出來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:可以是普通構造函數,甚至拷貝構造函數都是隻有一個構造函數。