最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++默認(rèn)構(gòu)造函數(shù)詳解

 更新時間:2026年06月05日 08:50:55   作者:Yolo_TvT  
本文詳細(xì)解析了C++中默認(rèn)成員函數(shù)的概念,包括默認(rèn)構(gòu)造函數(shù)的作用與生成規(guī)則,并探討了何時需要自定義默認(rèn)構(gòu)造函數(shù)及其應(yīng)用場景,感興趣的朋友一起看看吧

一、類的默認(rèn)成員函數(shù)

  • 當(dāng)你定義一個空類時,編譯器并不會真的“空手而歸”。它會自動為你生成6個(C++98)或更多(C++11后)特殊的成員函數(shù)。這些函數(shù)被稱為默認(rèn)成員函數(shù)。
  • 他們分別是:
函數(shù)作用
默認(rèn)構(gòu)造函數(shù)初始化對象
析構(gòu)函數(shù)清理對象資源
拷貝構(gòu)造函數(shù)用已有對象初始化新對象
賦值運算符重載將已有對象賦值給另一對象
移動構(gòu)造函數(shù)(C++11)用臨時對象“轉(zhuǎn)移”資源
移動賦值運算符(C++11)臨時對象賦值
  • 如果沒有主動聲明這些函數(shù),編譯器就會自動生成一個默認(rèn)版本,即為默認(rèn)成員函數(shù)。

二、構(gòu)造函數(shù)的基本概念

  • 構(gòu)造函數(shù)是類中一種特殊的成員函數(shù),它在對象創(chuàng)建時自動調(diào)用,用于初始化對象的成員變量。

構(gòu)造函數(shù)的規(guī)則:

  • 函數(shù)名與類名完全相同
  • 沒有返回值
  • 可以重載(可以有多個參數(shù)不同的構(gòu)造函數(shù))
  • 對象創(chuàng)建時自動執(zhí)行

三、默認(rèn)構(gòu)造函數(shù)的含義

  • 默認(rèn)構(gòu)造函數(shù)是指可以無實參可調(diào)用的構(gòu)造函數(shù)。它包括兩種情況:
    • 程序員定義的默認(rèn)構(gòu)造函數(shù):
      • 程序員定義的無參構(gòu)造函數(shù)。
      • 程序員定義的全缺省參數(shù)的構(gòu)造函數(shù)。
    • 程序員沒有定義構(gòu)造函數(shù),編譯器自動生成的隱式默認(rèn)構(gòu)造函數(shù)。
class Student {
public:
    // 無參構(gòu)造函數(shù)
    Student() {
        name = "無名";
        age = 0;
    }
private:
    string name;
    int age;
};
cpp
class Point {
public:
    // 全缺省參數(shù)的構(gòu)造函數(shù)(也是默認(rèn)構(gòu)造函數(shù))
    Point(int x = 0, int y = 0) : x(x), y(y) {}
private:
    int x, y;
};

四、編譯器自動生成的默認(rèn)構(gòu)造函數(shù)

  • 若程序員沒有實現(xiàn)構(gòu)造函數(shù),編譯器會為你生成一個隱式默認(rèn)構(gòu)造函數(shù)。
class Dog {
    string name;
    int age;
    // 編譯器自動生成 Dog() {}
};

這個隱式構(gòu)造函數(shù)會做什么?

  • 對于內(nèi)置類型(int, char, 指針等):不做任何初始化(不同編譯器效果不同)。
  • 對于自定義類型成員:調(diào)用它們各自的默認(rèn)構(gòu)造函數(shù)。
#include <iostream>
using namespace std;
class A {
public:
    A() { cout << "A的構(gòu)造函數(shù)" << endl; }
};
class B {
    int x;      // 內(nèi)置類型,不會初始化(垃圾值)
    A a;        // 類類型,會調(diào)用A的默認(rèn)構(gòu)造函數(shù)
};
int main() {
    B b;   // 輸出:A的構(gòu)造函數(shù)(x保持隨機)
}

一旦你實現(xiàn)了構(gòu)造函數(shù),編譯器就不再生成默認(rèn)構(gòu)造函數(shù)

class Student {
public:
    Student(string n) { name = n; }  // 自定義構(gòu)造函數(shù)
private:
    string name;
};
int main() {
    Student s1("張三");  // 正確
    // Student s2;       // 錯誤!沒有默認(rèn)構(gòu)造函數(shù)可用
}

如果你既需要帶參構(gòu)造,又需要無參構(gòu)造,需要手動提供默認(rèn)構(gòu)造函數(shù)。

五、默認(rèn)構(gòu)造函數(shù)的用途

1. 定義對象而不初始化

class Array {
    int* data;
public:
    Array() { data = nullptr; }  // 允許定義空數(shù)組對象
};
Array arr;   // 調(diào)用默認(rèn)構(gòu)造

2. 作為容器元素的默認(rèn)構(gòu)造要求

STL容器(如vector)在擴容或創(chuàng)建元素時,經(jīng)常需要元素的默認(rèn)構(gòu)造函數(shù)。

vector<Student> v(10);  // 需要Student有默認(rèn)構(gòu)造函數(shù)

3. 繼承體系中基類的初始化

派生類構(gòu)造函數(shù)會自動調(diào)用基類的默認(rèn)構(gòu)造函數(shù)(如果基類沒有默認(rèn)構(gòu)造,派生類必須顯式調(diào)用基類的帶參構(gòu)造)。

六、什么時候需要自定義默認(rèn)構(gòu)造函數(shù)?

情況是否需要
類沒有指針成員,且成員都有合理的默認(rèn)值不需要,編譯器生成即可
成員中需要分配資源需要(在構(gòu)造中分配并初始化)
需要給成員變量設(shè)置特定的初始值需要
類有自定義的帶參構(gòu)造,但仍需無參創(chuàng)建對象需要
class MyString {
    char* buf;
public:
    // 自定義默認(rèn)構(gòu)造:給指針一個安全的初始值
    MyString() {
        buf = new char[1];
        buf[0] = '\0';
    }
};

七、C++11 的改進(jìn):default 和 delete

C++11允許你顯式要求編譯器生成默認(rèn)版本,或禁止某個構(gòu)造函數(shù)。

class Widget {
public:
    Widget() = default;           // 手動要求編譯器生成默認(rèn)構(gòu)造
    Widget(const Widget&) = delete; // 禁止拷貝構(gòu)造
};

八、一個完整的例子

#include <iostream>
#include <string>
using namespace std;
class Book {
public:
    // 默認(rèn)構(gòu)造函數(shù)
    Book() {
        title = "未命名";
        price = 0.0;
        cout << "調(diào)用默認(rèn)構(gòu)造函數(shù)" << endl;
    }
    // 帶參構(gòu)造函數(shù)(不是默認(rèn)構(gòu)造)
    Book(string t, double p) : title(t), price(p) {
        cout << "調(diào)用帶參構(gòu)造函數(shù)" << endl;
    }
    void print() {
        cout << "書名:" << title << ",價格:" << price << endl;
    }
private:
    string title;
    double price;
};
int main() {
    Book b1;              // 調(diào)用默認(rèn)構(gòu)造
    Book b2("C++教程", 59.9); // 調(diào)用帶參構(gòu)造
    b1.print();
    b2.print();
    return 0;
}
輸出:
text
調(diào)用默認(rèn)構(gòu)造函數(shù)
調(diào)用帶參構(gòu)造函數(shù)
書名:未命名,價格:0
書名:C++教程,價格:59.9

到此這篇關(guān)于C++:默認(rèn)構(gòu)造函數(shù)的文章就介紹到這了,更多相關(guān)C++:默認(rèn)構(gòu)造函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++中try catch的用法小結(jié)

    c++中try catch的用法小結(jié)

    這篇文章主要介紹了c++中try catch的用法小結(jié),需要的朋友可以參考下
    2018-01-01
  • 基于C語言編寫一個簡單的Web服務(wù)器

    基于C語言編寫一個簡單的Web服務(wù)器

    C語言可以干大事,這篇文章主要為大家詳細(xì)介紹了如何基于C語言可以完成一個簡易的Web服務(wù)器,希望這篇文章會幫你你對C語言有更深入的理解
    2024-03-03
  • 詳細(xì)了解C語言二叉樹的建立與遍歷

    詳細(xì)了解C語言二叉樹的建立與遍歷

    這篇文章主要介紹了C中二叉樹的建立和各種遍歷實例代碼,涉及樹節(jié)點的定義,后序遍歷,層序遍歷,深度優(yōu)先和廣度優(yōu)先等相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考下
    2021-07-07
  • C++中使用正則匹配問題

    C++中使用正則匹配問題

    這篇文章主要介紹了C++中使用正則匹配問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言實現(xiàn)簡單五子棋小游戲

    C語言實現(xiàn)簡單五子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • QT利用QPdfWriter實現(xiàn)繪制PDF(支持表單輸出)

    QT利用QPdfWriter實現(xiàn)繪制PDF(支持表單輸出)

    這篇文章主要為大家詳細(xì)介紹了QT如何利用QPdfWriter實現(xiàn)繪制PDF,并可以支持表單輸出。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-01-01
  • C++?Cartographer源碼中關(guān)于MapBuilder的聲明與構(gòu)造

    C++?Cartographer源碼中關(guān)于MapBuilder的聲明與構(gòu)造

    這篇文章主要介紹了C++?Cartographer源碼中關(guān)于MapBuilder的聲明與構(gòu)造,前面已經(jīng)談到了Cartographer中添加軌跡的方法和傳感器的數(shù)據(jù)流動走向。在添加軌跡的時候,除了添加位姿估計器還有采樣器,訂閱回調(diào)函數(shù)之外,最重要的是通過map_builder_bridge添加了一條軌跡
    2023-03-03
  • 用C語言實現(xiàn)單鏈表的各種操作(二)

    用C語言實現(xiàn)單鏈表的各種操作(二)

    本篇文章是對用C語言實現(xiàn)單鏈表的各種操作進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ 讀寫文件安全又簡潔的簡單實例

    C++ 讀寫文件安全又簡潔的簡單實例

    這篇文章主要介紹了C++ 讀寫文件安全又簡潔的簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 使用C語言實現(xiàn)字符串左旋和右旋問題

    使用C語言實現(xiàn)字符串左旋和右旋問題

    這篇文章主要介紹了使用C語言實現(xiàn)字符串左旋和右旋問題,需要的朋友可以參考下
    2018-07-07

最新評論

天台县| 乃东县| 县级市| 兴安盟| 梁河县| 永年县| 楚雄市| 尼玛县| 钟祥市| 苗栗县| 长白| 彝良县| 察隅县| 新野县| 临沧市| 南平市| 江油市| 会宁县| 金华市| 合水县| 广宗县| 新宁县| 都江堰市| 建阳市| 孟津县| 郯城县| 蓝山县| 雷山县| 信宜市| 桃江县| 利辛县| 洛浦县| 彭阳县| 巧家县| 韶山市| 兰考县| 凤城市| 白水县| 邓州市| 肇州县| 自治县|