C++構造函數、拷貝構造函數

構造函數 ,是一種特殊的方法 。主要用來在創建對象時初始化對象, 即爲對象成員變量賦初始值,總與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 }

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