初始化 const 成员和引用类型成员(C++)
    
    初始化 const 成员和引用类型成员的问题,在 C++
    教材中讲述初始化列表的章节应该都有讲过,但是因为平时用得少,所以可能有不少人没注意到。待到用时又觉得一头雾水,摸不着头脑。
    
    初始化 static const 成员,
    也就是全局的静态常量,这个用到的情况比较多,想必大家都会。通常就是在类的定义中申明 static
    const 成员,然后在实现文
    件中赋予初始值,比如:
    /* (#) Test.h */
    #pragma once
    
    class Test {
    public:
    // 申明int 型的MASK 常量
    static const int MASK;
    };
    
    /* (#) Test.cpp */
    #include "Test.h"
    
    // 定义Test::MASK 常量,注意这里不需要static 关键字
    const int Test::MASK = 0xFFFF;
    
    虽然这种 static const 的情况使用得最多,但有时候也会想用非 static,却是 const 的情况。static
    const 定义的常量是全局的,对该类的
    每一个实例(对象)甚至在全局范围都有效,而且一致。便有时候需要的常量是针对每一个实例的,每个实例都可能有同类型但不同
    值的常量,这时候就要用到非 static,但 const 的申明,如
    class Test {
    public:
    const int MY_MASK;
    };
    
    
    这种情况下,要在实例文件中像初始化 static const 常量一样,对其进行初始化是行不通的。
    const int Test::MY_MASK = 0xFF;     // 这样会报重定义错误
    
    况且,就算编译能通过,也不能达到我们要求的“每个对象自己的常量”的要求。
    正确的初始化是通过构造函数的初始化列表来进行,如:
    class Test {
    public:
    const int MY_MASK;
    Test() : MY_MASK(0xff) {}
    };
    
    如果不是在初始化列表中对 const 常量进行初始化,而是在构造函数中对其赋值的话,是不能成功的。很简单的道理:不能给 const 成员赋值。同样的道理,如果要初始化
    一个引用类型的成员变量,也不能在构造函数体内赋
    值,而只能在构造函数的初始化列表中进行初始化。
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号