美文网首页
C++之初始化列表

C++之初始化列表

作者: 程序手艺人 | 来源:发表于2018-03-22 08:30 被阅读14次

    问题

    类中是否可以定义 const 成员?

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

    编译结果:

    t20.cpp:13:10: error: uninitialized const member in ‘class Test’
         Test t;
    
    • 代表类中可以定义const成员变量, 但是面临的问题是: 如何初始化类中const 成员变量

    这时候引入本文的重点, 初始化列表出场:


    类成员的初始化

    • C++ 中提供了初始化列表对成员变量进行初始化
    • 语法规则
    ClassName::ClassName() :
              m1(v1), m2(v1,v2),m3(v3)
    {
       //some other initialize operation 
    }
    

    注意事项

    • 成员的初始化顺序与成员的声明顺序相同
    • 成员的初始化顺序与初始化列表中位置无关
    • 初始化列表先于构造函数的函数体执行

    修改上述代码如下:

    #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());
    
    }
    
    
    • 正常编译输出: t.ci = 10

    类中的const 成员

    #include<stdio.h>
    
    class Value
    {
    private:
        int mi;
    public:
        Value(int i)
        {
            printf("i = %d\n",i) ;
            mi = i;
        }
        int get()
        {
            return mi; 
        }
    };
    
    
    class Test
    {
    private:
        const int ci;
        Value m3;
        Value m2;
        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;
    }
    

    输出:

    i = 3
    i = 2
    i = 1
    Test::Test()
    t.ci = 100
    t.ci = 10
    
    • 类中的const 成员会被分配空间的
    • 类中的const 成员的本质是只读变量
    • 类中的const 成员只能在初始化列表中指定初始值

    小结

    • 类中可以使用初始化列表对成员进行初始化
    • 初始化列表先于构造函数体执行
    • 类中可以定义const 成员变量
    • const 成员变量必须在初始化列表中指定初值
    • const 成员变量为只读变量

    相关文章

      网友评论

          本文标题:C++之初始化列表

          本文链接:https://www.haomeiwen.com/subject/yemzzxtx.html