欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++深入講解初始化列表的用法

 更新時(shí)間:2022年04月19日 08:41:58   作者:清風(fēng)自在?流水潺潺  
這篇文章主要介紹了C++成員初始化列表,除了可以使用構(gòu)造函數(shù)對類成員進(jìn)行初始化之外,C++還提供了另外一種初始化的方法,叫做成員初始化列表。下面來看看文章的詳細(xì)吧,需要的朋友可以參考一下

一、小問題

下面的類定義是否合法? 如果合法,ci 的值是什么,存儲在哪里?

下面編寫代碼一探究竟(代碼1):

#include <stdio.h>
 
class Test
{
private:
    const int ci;
public:
    Test()
    {
        ci = 10;
    }
    int getCI() 
    { 
        return ci; 
    }
};
 
 
int main()
{
    Test t;
    
    printf("t.ci = %d\n", t.getCI());
    
    return 0;
}

可以看到,編譯報(bào)錯,ci 沒有被初始化,如果要初始化,就得在 test() 那里進(jìn)行,且看下節(jié)初始化列表。

二、類成員的初始化

C++ 中提供了初始化列表對成員變量進(jìn)行初始化

語法規(guī)則

所以代碼 1 可以寫成:

#include <stdio.h>
 
class Test
{
private:
    const int ci;
public:
    Test() : ci(10)
    {
        //ci = 10;
    }
    int getCI() 
    { 
        return ci; 
    }
};
 
 
int main()
{
    Test t;
    
    printf("t.ci = %d\n", t.getCI());
    
    return 0;
}

這樣編譯就能通過,得到想要的結(jié)果:

注意事項(xiàng)

  • 成員的初始化順序與成員的聲明順序相同
  • 成員的初始化順序與初始化列表中的位置無關(guān)
  • 初始化列表先于構(gòu)造函數(shù)的函數(shù)體執(zhí)行

下面看一段初始化列表使用的代碼:

#include <stdio.h>
 
class Value
{
private:
    int mi;
public:
    Value(int i)
    {
        printf("i = %d\n", i);
        mi = i;
    }
    int getI()
    {
        return mi;
    }
};
 
class Test
{
private:
    Value m2;
    Value m3;
    Value m1;
public:
    Test() : m1(1), m2(2), m3(3)
    {
        printf("Test::Test()\n");
    }
};
 
 
int main()
{
    Test t;
    
    return 0;
}

輸出結(jié)果如下: 

這段代碼很好的將上面的注釋事項(xiàng)體現(xiàn)出來了,初始化順序是 m1,m2,m3,輸出順序確是 m2,m3,m1,并且構(gòu)造函數(shù)的函數(shù)體后于初始化列表的執(zhí)行。

三、類中的 const 成員

  • 類中的 const 成員會被分配空間的
  • 類中的 const 成員的本質(zhì)是只讀變量
  • 類中的 const 成員只能在初始化列表中指定初始值

編譯器無法直接得到 const 成員的初始值,因此無法進(jìn)入符號表成為真正意義上的常量。

下面看一段代碼:

#include <stdio.h>
 
class Value
{
private:
    int mi;
public:
    Value(int i)
    {
        printf("i = %d\n", i);
        mi = i;
    }
    int getI()
    {
        return mi;
    }
};
 
class Test
{
private:
    const int ci;
    Value m2;
    Value m3;
    Value m1;
public:
    Test() : m1(1), m2(2), m3(3), ci(100)
    {
        printf("Test::Test()\n");
    }
    int getCI()
    {
        return ci;
    }
    int setCI(int v)
    {
        int* p = const_cast<int*>(&ci);
        
        *p = v;
    }
};
 
 
int main()
{
    Test t;
    
    printf("t.ci = %d\n", t.getCI());
    
    t.setCI(10);
    
    printf("t.ci = %d\n", t.getCI());
    
    return 0;
}

下面為輸出結(jié)果:

這段代碼說明 const 不是真正意義上的常量,只是只讀變量。 

四、初始化與賦值的不同

  • 初始化:對正在創(chuàng)建的對象進(jìn)行初值設(shè)置
  • 賦:對已經(jīng)存在的對象進(jìn)行值設(shè)置

五、小結(jié)

  • 類中可以使用初始化列表對成員進(jìn)行初始化
  • 初始化列表先于構(gòu)造函數(shù)體執(zhí)行
  • 類中可以定義 const 成員變量
  • const 成員變量必須在初始化列表中指定初值
  • const 成員變量為只讀變量

到此這篇關(guān)于C++深入講解初始化列表的用法的文章就介紹到這了,更多相關(guān)C++ 初始化列表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)影院管理系統(tǒng)

    C語言實(shí)現(xiàn)影院管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)影院管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Qt專欄之模態(tài)與非模態(tài)對話框的實(shí)現(xiàn)

    Qt專欄之模態(tài)與非模態(tài)對話框的實(shí)現(xiàn)

    這篇文章主要介紹了Qt專欄之模態(tài)與非模態(tài)對話框的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • c語言求階乘精確值示例

    c語言求階乘精確值示例

    這篇文章主要介紹了c語言求階乘精確值示例,需要的朋友可以參考下
    2014-03-03
  • C語言通過三步翻轉(zhuǎn)法實(shí)現(xiàn)單詞倒置詳解

    C語言通過三步翻轉(zhuǎn)法實(shí)現(xiàn)單詞倒置詳解

    這篇文章主要為大家分享了用三步翻轉(zhuǎn)法將一句話的單詞進(jìn)行倒置的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-05-05
  • 利用Qt繪制雷達(dá)掃描效果

    利用Qt繪制雷達(dá)掃描效果

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt繪制簡單的雷達(dá)掃描效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-04-04
  • C++中對象的常引用、動態(tài)建立和釋放相關(guān)知識講解

    C++中對象的常引用、動態(tài)建立和釋放相關(guān)知識講解

    這篇文章主要介紹了C++中對象的常引用、動態(tài)建立和釋放相關(guān)知識講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C語言進(jìn)階棧幀示例詳解教程

    C語言進(jìn)階棧幀示例詳解教程

    這篇文章主要為大家介紹了C語言進(jìn)階棧幀的示例詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-02-02
  • C語言函數(shù)棧幀的創(chuàng)建與銷毀詳解

    C語言函數(shù)棧幀的創(chuàng)建與銷毀詳解

    函數(shù)棧幀(stack frame)就是函數(shù)調(diào)用過程中在程序的調(diào)用棧(call stack)所開辟的空間,下面這篇文章主要給大家介紹了關(guān)于C語言函數(shù)棧幀的創(chuàng)建與銷毀的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • C++十六進(jìn)制宏的用法詳解

    C++十六進(jìn)制宏的用法詳解

    C++十六進(jìn)制宏的用法;本文將詳細(xì)介紹
    2012-11-11
  • C語言線程對象和線程存儲的實(shí)現(xiàn)

    C語言線程對象和線程存儲的實(shí)現(xiàn)

    這篇文章主要介紹了C語言線程對象和線程存儲的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論