C++ 初始化列表


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

  語法規則:class_name::class_name()

          m1(v1),m2(v2,v3),m3(v3)

        {

          .......

        }

注意:

  成員的初始化順序,與成員的聲明順序相同。

  成員的初始化順序與初始化列表的位置無關。

  初始化列表比構造函數先執行。

測試代碼:  

 

#include <stdio.h>

class val
{
    private:
    int i;
    public:    
    val(int val)
    {    
        i = val;
        printf("i = %d\n",i);
    }
};
class Test
{
    private:
        const int Ci=10;
        val m1;
        val m2;
    public:
        Test():m2(2),m1(1)
        {
            //Ci = 1;
            printf("Test::Test()\n");
        }
        int get_Ci()
    {
        return Ci;
    }
};


int main(int argc, char *argv[])
{
    Test Ci;
    printf("Ci = %d\n",Ci.get_Ci());
    return 0;
}

 

 

 

  運行結果:  

i = 1
i = 2
Test::Test()
Ci = 10

 

類中的const成員

  類中個const成員變量會被分配空間,(所分配空間的位置取決於對象在哪個位置被聲明。)

  類中的const 成員的實質是一個只讀變量,可以通過指針修改其值。

  類中個const 可以使用初始化列表指定初始值,也可以在定義的時候進行初始化。、

  注意:編譯器無法得到const成員的初始值,因此在類中聲明的const 只讀變量無法進入符號表成為一個真正意義上的常量。

測試代碼:

  

#include <stdio.h>

class val
{
    private:
    int i;
    public:    
    val(int val)
    {    
        i = val;
        printf("i = %d\n",i);
    }
};
class Test
{
    private:
        const int Ci;
        val m1;
        val m2;
    public:
        Test():m2(2),m1(1),Ci(100)
        {
            //Ci = 1;
            printf("Test::Test()\n");
        }
        int get_Ci()
    {
        return Ci;
    }
    void change_Ci(int CI)
    {
        int *p = const_cast<int *>(&Ci);//delete only read
        *p = CI;
    }
};


int main(int argc, char *argv[])
{
    Test Ci;
    printf("Ci = %d\n",Ci.get_Ci());
    Ci.change_Ci(1000);
    printf("Ci = %d\n",Ci.get_Ci());
    return 0;
}

  上面代碼通過 const_cast<Type *>(&val);關鍵字去掉了Ci的只讀屬性。

  然后通過*p = CI; 修改Ci的值

運行結果:

  

i = 1
i = 2
Test::Test()
Ci = 100
Ci = 1000

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM