構造函數
,是一種特殊的方法 。主要用來在創建對象時初始化對象, 即爲對象成員變量賦初始值,總與new運算符一起使用在創建對象的語句中 。特別的一個類可以有多個構造函數 ,可根據其參數個數的不同或參數類型的不同來區分它們 即構造函數的重載。(摘自百度百科 構造函數 )。
class Base { public: Base(int var) : m_Var(var) { } private: int m_Var; };
構造函數無返回值類型,函數名和類型相同。
拷貝構造函數傳遞參數爲引用。
1 class Base 2 { 3 public: 4 Base(int var) : m_Var(var) 5 { 6 } 7 //拷貝構造函數 8 Base(Base &ref) : m_Var(ref.m_Var) 9 { 10 } 11 private: 12 int m_Var; 13 };拷貝構造函數,一般不需要自己編寫,系統默認的拷貝構造函數就能抗住了,但是有些情況需要在構造的時候開闢空間,這時候就需要拷貝構造函數了,如下代碼是摘自 林銳 博士的 高質量C++編程指南 一文。
1 class String
2 {
3 public:
4 String(const char *str = NULL); // 普通構造函數
5 String(const String &other); // 拷貝構造函數
6 ~ String(void); // 析構函數
7 private:
8 char *m_data; // 用於保存字符串
9 };
10 // String 的析構函數
11 String::~String(void)
12 {
13 delete [] m_data;
14 // 由於m_data 是內部數據類型,也可以寫成 delete m_data;
15 }
16
17 // String 的普通構造函數
18 String::String(const char *str)
19 {
20 if(str==NULL)
21 {
22 m_data = new char[1]; // 若能加 NULL 判斷則更好
23 *m_data = '\0';
24 }
25 else
26 {
27 int length = strlen(str);
28 m_data = new char[length+1]; // 若能加 NULL 判斷則更好
29 strcpy(m_data, str);
30 }
31 }
32 // 拷貝構造函數
33 String::String(const String &other)
34 {
35 int length = strlen(other.m_data);
36 m_data = new char[length+1]; // 若能加 NULL 判斷則更好
37 strcpy(m_data, other.m_data);
38 }
關於虛析構
虛析構一般伴隨着多態而產生,多態主要方式就是用基類的指針或引用指向或引用派生類,而形成多態。
但是這樣就會存在一個問題,當我們析構的時候,由於是基類的指針,就會調用的是基類的構造函數,從而造成派生內存溢出。爲了解決這個問題,引入了虛析構的概念。將基類的構造函數聲明爲虛,從而使其在調用析構函數的時候能夠準確的調用派生類的析構函數。
如下代碼必須用到虛析構才能準確的析構派生類,並釋放其佔有內存。
1 class Base
2 {
3 public:
4 Base(int b) : m_b(b)
5 {
6 }
7 //虛析構,使基類指針能準確的釋放所指向的派生類裏面的內容
8 virtual ~Base()
9 {
10 }
11 private:
12 int m_b;
13 };
14
15 class Derived : public Base
16 {
17 public:
18 Derived(int b, char *pStr) : Base(b)
19 {
20 m_pStr = new char[strlen(pStr)+1];
21 strcpy(m_pStr,pStr);
22 }
23 ~Derived()
24 {
25 delete m_pStr;
26 m_pStr = NULL;
27 }
28 private:
29 char *m_pStr;
30 };
31
32 int main(void)
33 {
34 char *pStr = "abcdefg";
35 Base *b = new Derived(1,pStr);
36 delete b;
37
38 return 0;
39 }