亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、小問(wèn)題

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

下面編寫代碼一探究竟(代碼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)錯(cuò),ci 沒(méi)有被初始化,如果要初始化,就得在 test() 那里進(jìn)行,且看下節(jié)初始化列表。

二、類成員的初始化

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

語(yǔ)法規(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;
}

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

注意事項(xiàng)

  • 成員的初始化順序與成員的聲明順序相同
  • 成員的初始化順序與初始化列表中的位置無(wú)關(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)出來(lái)了,初始化順序是 m1,m2,m3,輸出順序確是 m2,m3,m1,并且構(gòu)造函數(shù)的函數(shù)體后于初始化列表的執(zhí)行。

三、類中的 const 成員

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

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

下面看一段代碼:

#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é)果:

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

四、初始化與賦值的不同

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

五、小結(jié)

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

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

相關(guān)文章

最新評(píng)論