日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:清風自在?流水潺潺 ? 更新時間: 2022-06-18 編程語言

一、小問題

下面的類定義是否合法? 如果合法,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;
}

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

二、類成員的初始化

C++ 中提供了初始化列表對成員變量進行初始化

語法規則

所以代碼 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;
}

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

注意事項

  • 成員的初始化順序與成員的聲明順序相同
  • 成員的初始化順序與初始化列表中的位置無關
  • 初始化列表先于構造函數的函數體執行

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

#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;
}

輸出結果如下:?

這段代碼很好的將上面的注釋事項體現出來了,初始化順序是 m1,m2,m3,輸出順序確是 m2,m3,m1,并且構造函數的函數體后于初始化列表的執行。

三、類中的 const 成員

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

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

下面看一段代碼:

#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;
}

下面為輸出結果:

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

四、初始化與賦值的不同

  • 初始化:對正在創建的對象進行初值設置
  • 賦:對已經存在的對象進行值設置

五、小結

  • 類中可以使用初始化列表對成員進行初始化
  • 初始化列表先于構造函數體執行
  • 類中可以定義 const 成員變量
  • const 成員變量必須在初始化列表中指定初值
  • const 成員變量為只讀變量

原文鏈接:https://blog.csdn.net/weixin_43129713/article/details/123610627

欄目分類
最近更新