一、構造函數
1. 構造函數的定義:
1)C++中的類可以定義與類名相同的特殊成員函數,這種與類名相同的成員函數叫做構造函數;
2)構造函數在定義時可以有參數;
3)沒有任何返回類型的聲明。
2. 構造函數兩種調用方式:
自動調用:一般情況下C++編譯器會自動調用構造函數
手動調用:在一些情況下則需要手工調用構造函數
二、析構函數
1. 析構函數的定義:
1)C++中的類可以定義一個特殊的成員函數清理對象,這個特殊的成員函數叫做析構函數
語法:~ClassName()
2)析構函數沒有參數也沒有任何返回類型的聲明
3)析構函數在對象銷毀時自動被調用
2. 析構函數的調用:
C++編譯器自動調用
構造函數和析構函數的實際應用:
構造函數:
#include <stdio.h>class Test
{
public:// 構造函數:用來對類的成員變量進行初始化// 沒有返回值,函數名和類名一樣// 構造函數在定義對象的時候自動調用,一般情況下,不需要手動調用Test() // 無參構造{m_a = 1; m_b = 2;printf ("構造函數被調用....\n");}// 構造函數可以被重載Test(int a) // 有參構造{m_a;printf ("1111111111111個參數的構造函數被調用\n");}Test (const char *p){}// 拷貝構造函數(賦值構造函數)Test (const Test &obj){}Test (int a, int b){m_a = a;m_b = b;printf ("22222222222222個參數的構造函數被調用\n");}void setAB(int a, int b){m_a = a;m_b = b;}void print(){printf ("a = %d, b = %d\n", m_a, m_b);}
private:int m_a;int m_b;
};int main4_2()
{// 在定義對象的時候,會自動調用構造函數,這里會調用無參構造函數
#if 0Test t1,t2,t3,t4;t1.print();t4.print();
#endif// 對象定義方式:// 1、直接定義對象:括號法Test t1; // 調用無參構造函數Test t2(10); // 調用1個參數的構造函數Test t3(10,20); // 調用2個參數的構造函數// 2、等號的方式: 只能調用一個參數的構造函數,構造函數參數類型和等號右邊數據類型一致Test t4 = 10; // 調用1個參數的構造函數Test t5 = (10,20); // 調用1個參數的構造函數Test t6 = "asdsad";Test t7 = t4;// 3、手動調用構造函數Test t8 = Test();Test t9 = Test(10);Test t10 = Test(10,20);return 0;
}int main4_1()
{Test t1;t1.setAB(10,20);t1.print();return 0;
}
析構函數:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>class Test5_1
{
public:Test5_1(){m_a = 10;printf ("無參構造函數被調用\n");}// 析構函數: 沒有返回值、沒有參數、系統自動調用// 在對象被銷毀前會自動調用對象的析構函數~Test5_1(){printf ("*******************析構函數被調用\n");}
private:int m_a;
};int main5_1()
{{Test5_1 t;printf ("hello asdsadddddddddd\n");}printf ("-----------------------------\n");return 0;
}class Test5_2
{
public:Test5_2(){m_name = (char *)malloc(sizeof(char)*20);}~Test5_2(){if (m_name != NULL){free(m_name);m_name = NULL;}}
private:char *m_name;
};int main5_2()
{Test5_2 t1;return 0;
}