日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++分析構造函數與析造函數的特點梳理_C 語言

作者:Gy648 ? 更新時間: 2022-07-02 編程語言

構造函數的調用

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

1.默認構造函數(無參,函數體實現)--完成對象的初始化

2.默認析構函數(無參,函數體為空)--完成對象的清理

3.默認拷貝構造函數,屬性進行值拷貝

規則:

如果用戶定義了有參構造,c++不會提供無參構造,但是提供默認拷貝構造

如果用戶定義了拷貝構造函數,c++不會在提供其他函數

類名(){}

構造函數的語法

1,沒有返回值,也不寫void;

2,函數名稱與類名相同;

3,構造函數可以有參數,因此可以發生重載;

4,程序在調用對象時會自動調用構造函數,無需手動調用且只調用一次

析造函數~類名()

1.析造函數,沒有返回值也不寫void

2.函數名稱與類名相同在前面加上~

3.構造函數不可以有參數,因此不可以發生重載

4.程序在對象銷毀會自動調用析構,與構造函數的調用規則相同

構造函數的分類及調用

1.按照參數分類為 無參構造和 有參構造

class person
{
public:
    person()
    {
    cout<<"無參構造的調用"<<endl;
    }
    person(int a)
    {
    cout<<"有參構造的調用"<<endl;
    }
};

2.按照類型分為 普通構造和 拷貝構造

person(const person& p)
{
}

拷貝構造的語法

調用構造函數的方法

void test()
{
    //1.括號法
    person p1;//默認無參構造調用
    person p2(10);//默認有參構造的調用
     preson p3(p2);//拷貝構造的調用;
    //若是這樣寫 下面這行代碼會被認為是編譯器的聲明
     person p1();  // void func();
   // 無法完成函數的調用
    2.顯示法
    person p1;
    person p2=person(10);
    person p3=person(p2);
    // 匿名對象
   person(10);//特點:當前行執行結束后,系統會立即回收匿名對象
    // 3.隱式轉換法
    person p4=10;// 相當于 寫了 person p4 =person(10);
    person p5=p4;
}

拷貝構造的調用時機

1.使用一個已經創建完畢的對象來初始化一個新對象

2.值傳遞的形式給函數參數傳值

class p
{
};
void dowork(person p )//形參p
{
}
void test02()
{
    person p;
    dowork(p);// 相當于發生了隱式類型轉換 傳入值拷貝 person p=p;
}

3.值方式返回局部對象

深拷貝與淺拷貝

如果利用編譯器提供的拷貝構造函數

會做淺(值)拷貝的操作(會使得new的對象指針指向同一個地址),會帶來對堆區內存持續釋放的問題

如果堆區開辟了內存,可以在析構函數中釋放;

對于拷貝構造函數,可以自己實現一個拷貝構造函數(深拷貝)(new一個新的對象實現拷貝構造)

總結: 如果屬性有在堆區開辟,一定要自己提供拷貝構造函數,防止淺拷貝帶來的問題

初始化列表

c++提供了初始化列表語法用來初始化屬性

class person
{
    person(int a,int b,int c):m_a(a),m_b(b),m_c(c);
    {
    }
    int m_a;
    int m_b;
    int m_c;
};

原文鏈接:https://blog.csdn.net/m0_63515013/article/details/123507346

欄目分類
最近更新