1.構造函數和析構函數作用
不同類型對象的初始化和清除工作是不一樣的,因此構造函數和析構函數都是從屬於某個類的。
即每個類都有構造函數和析構函數,它們是類的成員函數。
- 構造函數的特點是:構造函數的名稱與類名相同,構造函數沒有返回值,一般定義爲公有函數。
- 複製構造函數是一類特殊的構造函數,用來複制對象時候調用
類名(類名&對象名); //複製構造函數原型
2. 派生類的構造函數和析構函數
基類的構造函數和析構函數不能被派生類繼承,派生類一般需要定義自己的構造函數和析構函數。
如果基類只有有參構造函數,那麼子類不能置之不理,必須在子類構造函數中顯式的調用父類的構造函數。
派生類名::派生類名(基類所需的形參,本類所需的形參):基類1(基類參數列表),基類2(基類參數列表2)......
- 構造函數調用順序:先父類後子類
- 析構函數調用順序:先子類後父類
#include<iostream>
using namespace std;
class base
{
private:
int m_base_data;
public:
base(int data) { m_base_data = data; cout << "基類構造函數被調用" << endl; }
~base() { cout << "基類的析構函數被調用,銷燬基類" << endl; }
};
class derliver :public base
{
private:
double m_deriver_data;
int *m_ptr;
public:
derliver(int bd, double dd);
~derliver();
};
derliver::derliver(int bd, double dd) :base(bd)
{
m_deriver_data = dd;
m_ptr = new int[256];
if (m_ptr == NULL)
cout << "子類的數組申請失敗" << endl;
cout << "派生類構造函數被調用" << endl;
}
derliver::~derliver()
{
if (m_ptr != nullptr)
{
delete[]m_ptr;
cout << "派生類的析構函數被調用" << endl;
}
}
int main()
{
derliver obj(1, 3.0);
cout << "主函數結束" << endl;
}