jeans chen
we've got them by the balls

初始化 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 成员赋值。同样的道理,如果要初始化 一个引用型的成员变量,也不能在构造函数体内赋 值,而只能在构造函数的初始化列表中进行初始化。

posted on 2013-12-16 11:02  jeans chen  阅读(295)  评论(0编辑  收藏  举报