1. 構造函數
定義:每個類都分別定義了它的對象被初始化的方式,類通過一個或者幾個特殊的成員函數來控制其對象的初始化過程,這些函數叫做構造函數。構造函數的任務是初始化類對象的數據成員,只要類的對象被創建,就會執行構造函數。
- 構造函數的名字和類名相同。
- 和其他函數不一樣的是,構造函數沒有返回類型。
- 類可以含有多個構造函數。
- 不同於其他成員函數,構造函數不能被聲明為const的。當我們創建類的一個const對象時,直到構造函數完成初始化過程,對象才能真正取得其“常量”屬性。
合成的默認構造函數
類通過一個特殊的構造函數來控制默認初始化過程,這個函數叫做默認構造函數。默認構造函數無需任何實參。
編譯器創建的默認構造函數將按照如下規則初始化類的數據成員:
- 如果存在類內的初始值,用它來初始化成員。
- 否則,默認初始化該成員。
2. 析構函數
定義:析構函數也是一個特殊的成員函數,沒有返回值,不需要程序員顯式調用,而是在銷毀對象時自動執行。構造函數的名字和類名相同,而析構函數的名字是在類名前面加一個~符合。
Note:析構函數沒有參數,不能被重載,因此一個類只能有一個析構函數。如果用戶沒有定義,編譯器會自動生成一個默認的析構函數。
析構函數的執行時機
- 在所有函數之外創建的對象是全局對象,它和全局變量類似,位於內存分區中的全局數據區,程序在結束執行時會調用這些對象的析構函數。
- 在函數內部創建的對象是局部對象,它和局部變量類似,位於棧區,函數執行結束時會調用這些對象的析構函數。
- new創建的對象位於堆區,通過delete刪除時才會調用析構函數;如果沒有delete,析構函數就不會被執行。
#include<iostream>
#include<string>
using namespace std;
class demo
{
public:
demo(string s);
~demo();
private:
string m_s;
};
demo::demo(string s):m_s(s){}
demo::~demo(){cout << m_s << endl;}
void func()
{
//局部對象
demo obj1("1");
}
//全局對象
demo obj2("2");
int main()
{
//局部對象
demo obj3("3");
//new創建的對象
demo *pobj4 = new demo("4");
func();
cout << "main" << endl;
return 0;
}