1.構造函數與析構函數
一個對象如果沒有初始化狀態,那麼他的使用後果是未知的;同樣如果使用完一個對象,沒有及時清理,也會造成一定的安全問題。
c++爲此提供了構造函數以及析構函數,如果我們不提供,編譯器也會自己提供。
- 構造函數:創建對象時爲對象的成員屬性賦值,構造函數由編譯器自動調用,無需手動調用
- 析構函數:對象銷燬前系統自動調用,執行一些清理工作
構造函數的語法:
- 構造函數沒有返回值也不寫void
- 函數名與類名相同
- 構造函數可以有參數,因此可以發生重載
- 程序在調用對象時候會自動調用構造函數,無需手打調用,並且只會調用一次
析構函數的語法:
- 析構函數,沒有返回值也不寫void
- 函數名與類名相同,在名稱前加上~
- 析構函數不可以有參數,因此不可以發生重載
- 程序在銷燬對象前候會自動調用析構函數,無需手動調用,並且只會調用一次
2.構造函數的分類及調用
兩種分類方式:
- 按參數分:有參構造和無參構造
- 按類型分:普通構造和拷貝構造
三種調用方法
- 括號法
- 顯示法
- 隱式轉換法
3.構造函數的調用規則
默認情況下,c++編譯器至少給一個類添加3個函數
- 默認構造函數(無參,函數體爲空)
- 默認析構函數(無參,函數體爲空)
- 默認拷貝構造函數,對屬性進行值拷貝
構造函數的調用規則如下:
- 如果用戶定義有參構造函數,c++不再提供默認無參構造函數,但會提供默認拷貝構造函數
- 如果用戶定義了拷貝構造函數,c++不會提供其他構造函數
4.初始化列表
c++提供了初始化語法來初始化屬性
Person(int a,int b,int c):m_a(a), m_b(b), m_c(c)
{
}
代碼實現
#include <iostream>
using namespace std;
class Person
{
//按照參數分:1、有參構造 2、無參構造
public:
//無參構造函數
Person()
{
cout << "person的構造函數" << endl;
}
//有參構造函數
Person(int a)
{
age = a;
cout << "person的構造函數" << endl;
}
//拷貝構造函數
Person(const Person &p)
{
age = p.age;
cout << "person的拷貝構造函數"
}
//析構函數
~Person()
{
cout << "person的析構函數" <<endl;
}
int age;
}
//調用
void test01()
{
//括號法
Person p;//默認
Person p2(10);//有參
Person p3(p2);//拷貝
//注意:調用默認構造函數不要加()
//例如person p1(); 編譯器會認爲是一個函數的聲明
//顯示法
Person p1;
Person p2 = Person(10);
Person p3 = Person(p2);
Person(10);//匿名對象 特點:當執行結束之後,系統會立刻回收匿名對象
//注意,不要用拷貝構造函數,初始化匿名對象
//隱式轉換法
Person p4 = 10; //相當於 person p4 = person(10)
}
int main()
{
test01(); //局部變量,存放在棧區,所以執行完之後,會釋放函數裏面的局部變量,因此會調用析構函數
//補充說明:
//類裏面的成員調用另一個類,會先執行被調用的那個類的構造函數,再執行這個類的構造函數。
//對於析構函數而言,按照先進後出的順序執行。
return 0;
}