1、一般構造函數
如果沒有提供任何構造函數,創建一個什麼都不做的構造函數
如:
test::test()
{}
如果希望編譯器不使用這種默認的構造函數
可以自己定義默認構造函數
test::test()
{
...........;
}
當然也可以自己傳入值定義構造函數
test::test(const char* tin)
{
...........;
}
2、復制構造函數
它用於將一個對象復制到一個新創建的對象中,類的復制構造函數原型如下:
class_name(const class_name &);
關於復制構造函數下面幾種情況會使用到:
test my1(my); 顯示調用,my1是和my一樣的副本
test my1 = test(my); 顯示調用,my1是和my一樣的副本
test my1 = my; 隱試調用,my1是和my一樣的副本
void tf1(test t1);函數傳值生成臨時的類對象在函數中使用
test *p = new test(my);未測試
簡單的說程序生成了對象的副本,編譯器都會使用復制構造函數;既然是副本我們可以想象如果類中定義的是指針類型,那麼指針指向的是同一片位置。如果此時調用析構函數會重復的釋放同一片內存區域,同時如果不定義復制構造函數,那麼某些計數器將不你能正常工作。
另外我們注意同一段函數中如果類中有靜態對象如下:
private:
static int num_s;
使用
int charin::num_s = 0;
那麼在調用這個類的函數中多次調用它使用值是共享的因為是同一塊內存區域。這個其實和一般的靜態內部變量沒什麼兩樣
我們來看一段代碼
這段程序報錯如下:
gaopeng@bogon:~/CPLUSPLUS/part11/c2$ ./a.out
10 mem alloc!
study c++ in 1
test
8 bytes mem alloc!
test123 in 2
test here: test123
8 bytes mem release!
out 1
*** Error in `./a.out': double free or corruption (fasttop): 0x00000000021c1030 ***
Aborted (core dumped)
我使用的LINUX g++編譯器,可以看報錯double free or corruption,重復的釋放,其實這裡的計數器num_s也不能正常工作。
這種情況下我們必須要自己定義復制構造函數,使用深度復制而不是簡單的為指針類型數據復制指針的指向而已。
我們在程序中加入:
接著我們再來跑一下我們的程序
10 mem alloc!
study c++ in 1
test
8 bytes mem alloc!
test123 in 2
8 bytes mem alloc!
test123 deep copy in 3
8 bytes mem alloc!
test123 deep copy in 4
test here: test123
8 bytes mem release!
test123 out 3
8 bytes mem release!
test123 out 2
8 bytes mem release!
test123 out 1
10 bytes mem release!
study c++ out 0
沒有問題了。
---endl---