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

C++類和對(duì)象之初始化列表的使用方式

 更新時(shí)間:2025年05月12日 09:57:45   作者:zzh_zao  
這篇文章主要介紹了C++類和對(duì)象之初始化列表的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C++初始化列表詳解:性能優(yōu)化與正確實(shí)踐

在C++編程中,初始化列表是構(gòu)造函數(shù)的重要組成部分,它不僅能提升代碼性能,還能確保成員變量被正確初始化。本文將深入探討初始化列表的語(yǔ)法、應(yīng)用場(chǎng)景及最佳實(shí)踐。

什么是初始化列表?

初始化列表是構(gòu)造函數(shù)的一部分,用于在對(duì)象創(chuàng)建時(shí)直接初始化成員變量。

它位于構(gòu)造函數(shù)參數(shù)列表之后,函數(shù)體之前,使用冒號(hào)(:)和逗號(hào)(,)分隔各成員的初始化操作。

class MyClass {
private:
    int value;
    std::string name;
    const double pi;
    int& ref;

public:
    // 使用初始化列表的構(gòu)造函數(shù)
    MyClass(int val, const std::string& nm, int& r)
        : value(val), name(nm), pi(3.14159), ref(r) {
        // 構(gòu)造函數(shù)體
    }
};

初始化列表的三大核心作用

1. 性能優(yōu)化:避免不必要的賦值操作

對(duì)于非基本類型(如std::string、std::vector),初始化列表可以直接調(diào)用其構(gòu)造函數(shù),而不是先默認(rèn)構(gòu)造再賦值。

對(duì)比示例:

// 使用初始化列表(高效)
class A {
public:
    A(const std::string& str) : data(str) {} // 直接構(gòu)造
private:
    std::string data;
};

// 使用賦值(低效)
class B {
public:
    B(const std::string& str) { data = str; } // 默認(rèn)構(gòu)造 + 賦值
private:
    std::string data;
};

2. 強(qiáng)制初始化:處理const和引用成員

const成員和引用必須在初始化時(shí)賦值,初始化列表是唯一的方式。

class Config {
private:
    const int maxSize;      // 常量成員
    std::string& filePath;  // 引用成員

public:
    Config(int size, std::string& path) 
        : maxSize(size), filePath(path) {} // 必須在初始化列表中賦值
};

3. 基類初始化:正確調(diào)用父類構(gòu)造函數(shù)

當(dāng)基類沒有默認(rèn)構(gòu)造函數(shù)時(shí),必須通過初始化列表顯式調(diào)用其帶參構(gòu)造函數(shù)。

class Base {
public:
    Base(int value) { /* ... */ }
};

class Derived : public Base {
public:
    Derived(int x) : Base(x) { /* ... */ } // 調(diào)用基類構(gòu)造函數(shù)
};

4.必須使用初始化列表的情況

在C++中,引用、const成員變量以及沒有默認(rèn)構(gòu)造函數(shù)的類類型成員變量必須在構(gòu)造函數(shù)初始化列表中進(jìn)行初始化,這是由它們的語(yǔ)義和C++對(duì)象生命周期的規(guī)則決定的。

1. 引用(Reference)

引用的本質(zhì)是對(duì)象的別名,一旦綁定到某個(gè)對(duì)象就無法重新綁定。因此:

  • 必須在創(chuàng)建時(shí)初始化:引用沒有“未初始化”狀態(tài),必須在定義時(shí)指定其引用的對(duì)象。
  • 構(gòu)造函數(shù)體執(zhí)行前成員已初始化:構(gòu)造函數(shù)體中的代碼執(zhí)行時(shí),成員變量已經(jīng)完成初始化。若在構(gòu)造函數(shù)體內(nèi)對(duì)引用賦值,實(shí)際上是對(duì)已初始化的引用進(jìn)行賦值操作(改變被引用對(duì)象的值),而非初始化引用本身。

示例:

class Example {
private:
    int& ref;  // 引用必須初始化
public:
    Example(int& value) : ref(value) {}  // 正確:初始化列表中初始化
};

2. const 成員變量

const成員變量的值在對(duì)象的生命周期內(nèi)不可修改,因此:

  • 必須在初始化時(shí)賦值const變量一旦初始化就不能再被賦值。
  • 初始化列表是唯一機(jī)會(huì):構(gòu)造函數(shù)體執(zhí)行前,const成員必須已經(jīng)被賦予初始值。

示例:

class Example {
private:
    const int value;  // const成員必須初始化
public:
    Example(int val) : value(val) {}  // 正確:初始化列表中初始化
};

3. 沒有默認(rèn)構(gòu)造函數(shù)的類類型成員

如果一個(gè)類沒有默認(rèn)構(gòu)造函數(shù)(即沒有無參構(gòu)造函數(shù)),則在創(chuàng)建該類的對(duì)象時(shí)必須顯式提供參數(shù)。因此:

  • 必須通過參數(shù)初始化:編譯器無法默認(rèn)構(gòu)造該成員,必須顯式調(diào)用其帶參構(gòu)造函數(shù)。
  • 初始化列表提供了顯式調(diào)用的機(jī)會(huì):在初始化列表中,可以指定參數(shù)來調(diào)用成員的帶參構(gòu)造函數(shù)。

示例:

class Inner {
public:
    Inner(int x) {}  // 只有帶參構(gòu)造函數(shù)
};

class Example {
private:
    Inner inner;  // Inner沒有默認(rèn)構(gòu)造函數(shù)
public:
    Example(int x) : inner(x) {}  // 正確:顯式調(diào)用Inner的帶參構(gòu)造函數(shù)
};

為什么不能在構(gòu)造函數(shù)體中初始化?

構(gòu)造函數(shù)體中的代碼執(zhí)行時(shí),成員變量已經(jīng)完成初始化(默認(rèn)初始化或編譯器生成的初始化)。因此:

  • 引用和const成員:無法在構(gòu)造函數(shù)體中重新初始化,因?yàn)樗鼈儽仨氃诔跏蓟瘯r(shí)就確定值。
  • 無默認(rèn)構(gòu)造函數(shù)的類成員:如果未在初始化列表中顯式構(gòu)造,編譯器會(huì)嘗試調(diào)用其默認(rèn)構(gòu)造函數(shù),但由于該類沒有默認(rèn)構(gòu)造函數(shù),會(huì)導(dǎo)致編譯錯(cuò)誤。

初始化列表的作用是在對(duì)象的內(nèi)存分配后、構(gòu)造函數(shù)體執(zhí)行前,顯式控制成員變量的初始化過程。對(duì)于引用、const成員和無默認(rèn)構(gòu)造函數(shù)的類成員,初始化列表是唯一能滿足其初始化語(yǔ)義的地方。若不使用初始化列表,代碼將因“未初始化的引用/const成員”或“無法默認(rèn)構(gòu)造的類成員”而編譯失敗。

初始化列表的語(yǔ)法規(guī)則

1. 初始化順序由聲明順序決定

成員變量的初始化順序由其在類中聲明的順序決定,而非初始化列表中的順序。錯(cuò)誤的順序可能導(dǎo)致未定義行為。

class Example {
private:
    int a;
    int b;

public:
    // 危險(xiǎn):初始化列表順序與聲明順序不一致
    Example(int value) : b(value), a(b) {} // a先被初始化,但此時(shí)b未初始化
};

2. 支持表達(dá)式初始化

可以使用常量、函數(shù)返回值或其他成員變量進(jìn)行初始化。

class Point {
private:
    int x;
    int y;
    int distance;

public:
    Point(int _x, int _y) 
        : x(_x), y(_y), 
          distance(calculateDistance(_x, _y)) {} // 使用函數(shù)返回值初始化

    int calculateDistance(int x, int y) const {
        return std::sqrt(x*x + y*y);
    }
};

初始化列表 vs 構(gòu)造函數(shù)體賦值

特性初始化列表構(gòu)造函數(shù)體賦值
執(zhí)行時(shí)機(jī)對(duì)象創(chuàng)建時(shí)對(duì)象創(chuàng)建后
性能通常更高效可能涉及額外的賦值操作
const/引用成員支持不支持
基類初始化必須使用不可用

總結(jié)

初始化列表總結(jié):

  • 無論是否顯?寫初始化列表,每個(gè)構(gòu)造函數(shù)都有初始化列表;
  • 無論是否在初始化列表顯?初始化成員變量,每個(gè)成員變量都要?初始化列表初始化;

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 用C語(yǔ)言實(shí)現(xiàn)井字棋游戲代碼

    用C語(yǔ)言實(shí)現(xiàn)井字棋游戲代碼

    大家好,本篇文章主要講的是用C語(yǔ)言實(shí)現(xiàn)井字棋游戲代碼,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++實(shí)現(xiàn)日期類的方法詳解

    C++實(shí)現(xiàn)日期類的方法詳解

    這篇文章主要給大家介紹了C++實(shí)現(xiàn)日期類的方法,文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • C語(yǔ)言編程遞歸算法實(shí)現(xiàn)漢諾塔

    C語(yǔ)言編程遞歸算法實(shí)現(xiàn)漢諾塔

    遞歸,大家都了解,著名的斐波那契數(shù),就為該知識(shí)點(diǎn)的經(jīng)典例題。今天來看看更為經(jīng)典的遞歸題漢諾塔不過這其實(shí)是數(shù)學(xué)問題,先來看看漢諾塔
    2021-09-09
  • C++基于easyx圖形庫(kù)實(shí)現(xiàn)推箱子游戲

    C++基于easyx圖形庫(kù)實(shí)現(xiàn)推箱子游戲

    這篇文章主要為大家詳細(xì)介紹了C++基于easyx圖形庫(kù)實(shí)現(xiàn)推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • c++如何實(shí)現(xiàn)歸并兩個(gè)有序鏈表

    c++如何實(shí)現(xiàn)歸并兩個(gè)有序鏈表

    這篇文章主要介紹了c++如何實(shí)現(xiàn)歸并兩個(gè)有序鏈表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • c++數(shù)組排序的5種方法實(shí)例代碼

    c++數(shù)組排序的5種方法實(shí)例代碼

    大家還在為大小排序而煩惱嗎?今天讓我我大家解決這個(gè)問題吧,下面這篇文章主要給大家介紹了關(guān)于c++數(shù)組排序的5種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • C++14新特性的所有知識(shí)點(diǎn)全在這

    C++14新特性的所有知識(shí)點(diǎn)全在這

    這篇文章主要介紹了C++14新特性的所有知識(shí)點(diǎn)全在這,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Qt Creator使用教程的簡(jiǎn)單說明

    Qt Creator使用教程的簡(jiǎn)單說明

    如今 Qt Creator 功能十分強(qiáng)大了,包含項(xiàng)目模板生成、代碼編輯、UI 設(shè)計(jì)、QML 界面編輯、調(diào)試程序、上下文幫助等豐富功能,本文就詳細(xì)的介紹一下如何使用
    2021-08-08
  • C++ 函數(shù)重載之規(guī)則、實(shí)現(xiàn)與實(shí)戰(zhàn)案例解析

    C++ 函數(shù)重載之規(guī)則、實(shí)現(xiàn)與實(shí)戰(zhàn)案例解析

    本文主要介紹了C++函數(shù)重載的核心規(guī)則,包括函數(shù)重載的匹配原則、與默認(rèn)參數(shù)的沖突處理以及實(shí)戰(zhàn)場(chǎng)景中的重載應(yīng)用,通過實(shí)例展示了如何實(shí)現(xiàn)一個(gè)通用計(jì)算器,支持整數(shù)和浮點(diǎn)數(shù)的加減乘除運(yùn)算,并通過參數(shù)校驗(yàn)避免除零錯(cuò)誤,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • c語(yǔ)言通過opencv實(shí)現(xiàn)輪廓處理與切割

    c語(yǔ)言通過opencv實(shí)現(xiàn)輪廓處理與切割

    這篇文章主要介紹了c語(yǔ)言通過opencv實(shí)現(xiàn)輪廓處理與切割,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01

最新評(píng)論

阿拉善盟| 汉沽区| 宁陵县| 广宗县| 广宗县| 闵行区| 宁武县| 蓬安县| 手游| 达拉特旗| 梁平县| 绍兴县| 新化县| 乌鲁木齐市| 贞丰县| 治多县| 卢氏县| 托克逊县| 布拖县| 高邑县| 凉城县| 县级市| 鄱阳县| 惠州市| 葵青区| 关岭| 工布江达县| 永丰县| 茌平县| 北安市| 兰西县| 策勒县| 旬邑县| 襄城县| 邳州市| 嘉义县| 始兴县| 博罗县| 永春县| 丹东市| 高密市|