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

c++中類的對(duì)象初始化的實(shí)現(xiàn)示例

 更新時(shí)間:2025年10月10日 09:08:43   作者:start_up_go  
C++對(duì)象初始化依賴構(gòu)造函數(shù),包含默認(rèn)、帶參、初始化列表、拷貝及C++11的列表和委托構(gòu)造等方法,聚合類與new動(dòng)態(tài)初始化亦適用,初始化與賦值區(qū)別在于前者在創(chuàng)建時(shí)執(zhí)行,后者在對(duì)象存在后修改,且const/引用成員僅能初始化

在 C++ 中,類的對(duì)象初始化是創(chuàng)建對(duì)象時(shí)為其成員變量賦予初始值的過程,核心依賴構(gòu)造函數(shù)(類的特殊成員函數(shù))。根據(jù)場(chǎng)景和需求,對(duì)象初始化有多種方式,下面詳細(xì)介紹:

一、構(gòu)造函數(shù):初始化的核心

構(gòu)造函數(shù)是與類同名的特殊成員函數(shù),用于對(duì)象創(chuàng)建時(shí)的初始化,其特點(diǎn):

  • 無返回值(無需寫void);
  • 可重載(定義多個(gè)參數(shù)不同的構(gòu)造函數(shù));
  • 若未手動(dòng)定義,編譯器會(huì)生成默認(rèn)構(gòu)造函數(shù)(無參,僅為成員變量執(zhí)行默認(rèn)初始化)。

二、對(duì)象初始化的具體方式

1. 默認(rèn)初始化(無參構(gòu)造函數(shù))

當(dāng)類有默認(rèn)構(gòu)造函數(shù)(無參構(gòu)造函數(shù))時(shí),可直接創(chuàng)建對(duì)象,無需傳遞參數(shù)。

默認(rèn)構(gòu)造函數(shù)的來源:

  • 手動(dòng)定義:類名();
  • 編譯器自動(dòng)生成(僅當(dāng)未定義任何構(gòu)造函數(shù)時(shí))。

示例

#include <iostream>
using namespace std;

class Person {
private:
    string name;
    int age;
public:
    // 手動(dòng)定義默認(rèn)構(gòu)造函數(shù)
    Person() {
        name = "Unknown";
        age = 0;
        cout << "默認(rèn)構(gòu)造函數(shù)被調(diào)用" << endl;
    }

    void show() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    // 默認(rèn)初始化(調(diào)用默認(rèn)構(gòu)造函數(shù))
    Person p1;  // 正確:無參構(gòu)造
    p1.show();  // 輸出:Name: Unknown, Age: 0

    return 0;
}

注意:若手動(dòng)定義了帶參構(gòu)造函數(shù),編譯器不再生成默認(rèn)構(gòu)造函數(shù),此時(shí)需顯式定義,否則Person p1;會(huì)報(bào)錯(cuò)。

2. 帶參數(shù)的構(gòu)造函數(shù)初始化

通過自定義帶參數(shù)的構(gòu)造函數(shù),在創(chuàng)建對(duì)象時(shí)傳遞參數(shù),直接初始化成員變量。

示例

class Person {
private:
    string name;
    int age;
public:
    // 帶參數(shù)的構(gòu)造函數(shù)
    Person(string n, int a) {
        name = n;  // 為成員變量賦值
        age = a;
        cout << "帶參構(gòu)造函數(shù)被調(diào)用" << endl;
    }

    void show() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    // 用帶參構(gòu)造函數(shù)初始化
    Person p2("Alice", 18);  // 直接傳遞參數(shù)
    p2.show();  // 輸出:Name: Alice, Age: 18

    return 0;
}

3. 成員初始化列表(推薦)

構(gòu)造函數(shù)的成員初始化列表用于在進(jìn)入構(gòu)造函數(shù)體之前,直接初始化成員變量(而非在函數(shù)體內(nèi)賦值)。

適用場(chǎng)景

  • 初始化const成員變量(必須在定義時(shí)初始化);
  • 初始化引用成員(&,必須在定義時(shí)初始化);
  • 初始化沒有默認(rèn)構(gòu)造函數(shù)的成員對(duì)象(如類的成員是另一個(gè)類的對(duì)象,且該類無默認(rèn)構(gòu)造)。

語法

類名(參數(shù)列表) : 成員1(值1), 成員2(值2), ... {
    // 構(gòu)造函數(shù)體(可空)
}

示例

class Person {
private:
    string name;
    const int age;  // const成員,必須初始化
    int& id;        // 引用成員,必須初始化

public:
    // 成員初始化列表:直接初始化成員
    Person(string n, int a, int& i) : name(n), age(a), id(i) {
        // 構(gòu)造函數(shù)體可做其他操作,無需再給成員賦值
        cout << "成員初始化列表被使用" << endl;
    }

    void show() {
        cout << "Name: " << name << ", Age: " << age << ", ID: " << id << endl;
    }
};

int main() {
    int num = 1001;
    Person p3("Bob", 20, num);  // 傳遞參數(shù)到初始化列表
    p3.show();  // 輸出:Name: Bob, Age: 20, ID: 1001

    return 0;
}

優(yōu)勢(shì):比在構(gòu)造函數(shù)體內(nèi)賦值更高效(直接初始化,而非先默認(rèn)構(gòu)造再賦值)。

4. 拷貝構(gòu)造函數(shù)初始化

已存在的對(duì)象初始化新對(duì)象時(shí),會(huì)調(diào)用拷貝構(gòu)造函數(shù)。

拷貝構(gòu)造函數(shù)的語法(參數(shù)必須是同類對(duì)象的const引用):

類名(const 類名& 已有對(duì)象) {
    // 用已有對(duì)象的成員初始化當(dāng)前對(duì)象的成員
}

調(diào)用場(chǎng)景

  • 用對(duì)象 A 初始化對(duì)象 B(類名 B = A; 或 類名 B(A););
  • 對(duì)象作為函數(shù)參數(shù)按值傳遞;
  • 函數(shù)返回對(duì)象(按值返回)。

示例

class Person {
private:
    string name;
    int age;
public:
    // 帶參構(gòu)造函數(shù)
    Person(string n, int a) : name(n), age(a) {}

    // 拷貝構(gòu)造函數(shù)(自定義)
    Person(const Person& other) {
        name = other.name;  // 拷貝other的name
        age = other.age;    // 拷貝other的age
        cout << "拷貝構(gòu)造函數(shù)被調(diào)用" << endl;
    }

    void show() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }
};

int main() {
    Person p4("Charlie", 22);  // 先創(chuàng)建p4
    Person p5 = p4;            // 用p4初始化p5(調(diào)用拷貝構(gòu)造)
    Person p6(p4);             // 另一種寫法(同樣調(diào)用拷貝構(gòu)造)

    p5.show();  // 輸出:Name: Charlie, Age: 22
    p6.show();  // 輸出:Name: Charlie, Age: 22

    return 0;
}

注意:若未手動(dòng)定義拷貝構(gòu)造函數(shù),編譯器會(huì)生成默認(rèn)拷貝構(gòu)造函數(shù)(淺拷貝)。若類中包含指針成員,淺拷貝可能導(dǎo)致內(nèi)存問題(需手動(dòng)實(shí)現(xiàn)深拷貝)。

5. 列表初始化(C++11 及以上)

使用大括號(hào){} 初始化對(duì)象,支持多種場(chǎng)景,且更安全(防止窄化轉(zhuǎn)換,如int不能隱式接收double的小數(shù)部分)。

示例

class Person {
private:
    string name;
    int age;
public:
    // 帶參構(gòu)造函數(shù)(支持列表初始化)
    Person(string n, int a) : name(n), age(a) {}
    void show() { cout << name << ", " << age << endl; }
};

int main() {
    // 列表初始化(調(diào)用帶參構(gòu)造)
    Person p7{"David", 25};  // 等價(jià)于 Person p7("David", 25);
    Person p8 = {"Eve", 26}; // 也支持等號(hào)+大括號(hào)

    p7.show();  // David, 25
    p8.show();  // Eve, 26

    return 0;
}

優(yōu)勢(shì)

  • 統(tǒng)一初始化語法(可用于內(nèi)置類型、數(shù)組、容器等);
  • 防止窄化轉(zhuǎn)換(如Person p{123.45, "abc"}會(huì)編譯報(bào)錯(cuò),因參數(shù)類型不匹配)。

6. 委托構(gòu)造函數(shù)(C++11 及以上)

允許一個(gè)構(gòu)造函數(shù)調(diào)用同一個(gè)類的另一個(gè)構(gòu)造函數(shù),減少代碼重復(fù)。

示例

class Person {
private:
    string name;
    int age;
public:
    // 核心構(gòu)造函數(shù)(帶參數(shù))
    Person(string n, int a) : name(n), age(a) {
        cout << "核心構(gòu)造函數(shù)被調(diào)用" << endl;
    }

    // 委托構(gòu)造:調(diào)用帶參構(gòu)造函數(shù)(默認(rèn)name為"Unknown",age為0)
    Person() : Person("Unknown", 0) {
        cout << "委托構(gòu)造函數(shù)(無參)被調(diào)用" << endl;
    }

    // 委托構(gòu)造:調(diào)用帶參構(gòu)造函數(shù)(僅指定age,name默認(rèn)"Guest")
    Person(int a) : Person("Guest", a) {
        cout << "委托構(gòu)造函數(shù)(僅age)被調(diào)用" << endl;
    }
};

int main() {
    Person p9;      // 調(diào)用無參委托構(gòu)造 → 核心構(gòu)造
    Person p10(30); // 調(diào)用單參委托構(gòu)造 → 核心構(gòu)造
    return 0;
}

輸出

核心構(gòu)造函數(shù)被調(diào)用
委托構(gòu)造函數(shù)(無參)被調(diào)用
核心構(gòu)造函數(shù)被調(diào)用
委托構(gòu)造函數(shù)(僅age)被調(diào)用

7. 聚合類的初始化

聚合類是一種特殊的類(或結(jié)構(gòu)體),滿足:

  • 無用戶定義的構(gòu)造函數(shù);
  • 無私有 / 保護(hù)的非靜態(tài)成員;
  • 無基類;
  • 無虛函數(shù)。

聚合類可直接用初始化列表初始化成員(按成員聲明順序)。

示例

// 聚合類(結(jié)構(gòu)體,滿足聚合類條件)
struct Student {
    string name;  // 公有成員
    int age;
    float score;
};

int main() {
    // 直接初始化聚合類的成員(按聲明順序)
    Student s1 = {"Frank", 19, 90.5};
    Student s2{"Grace", 20, 88.0};  // C++11列表初始化

    cout << s1.name << ", " << s1.age << ", " << s1.score << endl;  // Frank, 19, 90.5
    return 0;
}

8. 動(dòng)態(tài)對(duì)象初始化(new關(guān)鍵字)

new創(chuàng)建堆上的對(duì)象時(shí),需顯式調(diào)用構(gòu)造函數(shù)初始化,后續(xù)用delete釋放。

示例

class Person {
private:
    string name;
public:
    Person(string n) : name(n) {}
    void show() { cout << name << endl; }
};

int main() {
    // 動(dòng)態(tài)初始化(堆上創(chuàng)建對(duì)象)
    Person* p11 = new Person("Helen");  // 調(diào)用帶參構(gòu)造
    Person* p12 = new Person{"Ivy"};    // C++11列表初始化
    Person* p13 = new Person();         // 調(diào)用默認(rèn)構(gòu)造(若存在)

    p11->show();  // Helen
    p12->show();  // Ivy

    // 釋放堆內(nèi)存
    delete p11;
    delete p12;
    delete p13;

    return 0;
}

三、初始化與賦值的區(qū)別

  • 初始化:對(duì)象創(chuàng)建時(shí)賦予初始值(調(diào)用構(gòu)造函數(shù)或初始化列表),僅執(zhí)行一次;
  • 賦值:對(duì)象創(chuàng)建后,通過賦值運(yùn)算符(=)修改成員變量,可執(zhí)行多次。

對(duì)const成員、引用成員等,只能初始化,不能賦值。

總結(jié)

C++ 對(duì)象初始化方式多樣,核心是通過構(gòu)造函數(shù)實(shí)現(xiàn),根據(jù)場(chǎng)景選擇:

  • 簡(jiǎn)單初始化:用默認(rèn)構(gòu)造或帶參構(gòu)造;
  • 高效 / 特殊成員(const、引用):用成員初始化列表;
  • 復(fù)用對(duì)象:用拷貝構(gòu)造;
  • 簡(jiǎn)潔安全:用列表初始化({});
  • 減少代碼重復(fù):用委托構(gòu)造。

到此這篇關(guān)于c++中類的對(duì)象初始化的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)c++ 類對(duì)象初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • C語言實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng)

    C語言實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++函數(shù)重載的細(xì)節(jié)圖文詳解

    C++函數(shù)重載的細(xì)節(jié)圖文詳解

    函數(shù)重載即函數(shù)名相同,函數(shù)形參列表不同(函數(shù)特征標(biāo)不同)的一類函數(shù)稱為函數(shù)重載,下面這篇文章主要給大家介紹了關(guān)于C++函數(shù)重載的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • 關(guān)于"引用"的幾點(diǎn)說明介紹

    關(guān)于"引用"的幾點(diǎn)說明介紹

    引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個(gè)名稱,即該目標(biāo)原名稱和引用名,且不能再把該引用名作為其他變量名的別名
    2013-09-09
  • c++ 類成員變量默認(rèn)初始值的實(shí)現(xiàn)

    c++ 類成員變量默認(rèn)初始值的實(shí)現(xiàn)

    本文主要介紹了c++ 類成員變量默認(rèn)初始值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • C# CLR 中學(xué)習(xí) C++關(guān)鍵詞extern使用詳解

    C# CLR 中學(xué)習(xí) C++關(guān)鍵詞extern使用詳解

    這篇文章主要為大家介紹了C# CLR 中學(xué)習(xí) C++ 之extern使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 使用用C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼

    使用用C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼

    大家好,本篇文章主要講的是使用用C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼,感興趣的同學(xué)趕快來看一看吧,歡迎借鑒學(xué)習(xí)C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼
    2021-12-12
  • C語言用fstat函數(shù)獲取文件的大小方法

    C語言用fstat函數(shù)獲取文件的大小方法

    今天小編就為大家分享一篇關(guān)于C語言用fstat函數(shù)獲取文件的大小方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例

    Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例

    這篇文章主要為大家介紹了Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 詳解C++中mutable的用法

    詳解C++中mutable的用法

    這篇文章主要介紹了詳解C++中mutable的用法,幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下
    2020-08-08
  • C語言循環(huán)隊(duì)列的表示與實(shí)現(xiàn)實(shí)例詳解

    C語言循環(huán)隊(duì)列的表示與實(shí)現(xiàn)實(shí)例詳解

    這篇文章主要介紹了C語言循環(huán)隊(duì)列的表示與實(shí)現(xiàn),對(duì)于數(shù)據(jù)結(jié)構(gòu)與算法的研究很有幫助,需要的朋友可以參考下
    2014-07-07

最新評(píng)論

黄陵县| 卫辉市| 运城市| 镇康县| 绥中县| 彭泽县| 平原县| 墨竹工卡县| 巴彦县| 崇信县| 红桥区| 天峨县| 乐安县| 庆阳市| 花莲县| 常熟市| 汝城县| 文成县| 河曲县| 葫芦岛市| 新乡市| 洞口县| 海宁市| 安义县| 施甸县| 奉节县| 贵阳市| 西充县| 镇平县| 惠来县| 平湖市| 育儿| 江都市| 略阳县| 陆丰市| 从化市| 陆良县| 武邑县| 天柱县| 咸宁市| 靖州|