c++基礎複習——對象初始化與清理

1.構造函數與析構函數

一個對象如果沒有初始化狀態,那麼他的使用後果是未知的;同樣如果使用完一個對象,沒有及時清理,也會造成一定的安全問題。

c++爲此提供了構造函數以及析構函數,如果我們不提供,編譯器也會自己提供。

  • 構造函數:創建對象時爲對象的成員屬性賦值,構造函數由編譯器自動調用,無需手動調用
  • 析構函數:對象銷燬前系統自動調用,執行一些清理工作

構造函數的語法:

  1. 構造函數沒有返回值也不寫void
  2. 函數名與類名相同
  3. 構造函數可以有參數,因此可以發生重載
  4. 程序在調用對象時候會自動調用構造函數,無需手打調用,並且只會調用一次

析構函數的語法:

  1. 析構函數,沒有返回值也不寫void
  2. 函數名與類名相同,在名稱前加上~
  3. 析構函數不可以有參數,因此不可以發生重載
  4. 程序在銷燬對象前候會自動調用析構函數,無需手動調用,並且只會調用一次

2.構造函數的分類及調用

兩種分類方式:

  1. 按參數分:有參構造和無參構造
  2. 按類型分:普通構造和拷貝構造

三種調用方法

  • 括號法
  • 顯示法
  • 隱式轉換法

3.構造函數的調用規則

默認情況下,c++編譯器至少給一個類添加3個函數

  1. 默認構造函數(無參,函數體爲空)
  2. 默認析構函數(無參,函數體爲空)
  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;
}

 

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