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

 

posted @ 2019-10-12 12:57  Dipsyhu  阅读(2399)  评论(0编辑  收藏  举报