1 初始设计
1 需求说明
因为业务背景需要,需要做以下需求:
1, 定义一个属于“类”的成员变量,即所有对象都可以访问这个成员。
2, 这是一个“复杂的类成员”,即是一个复合类型,如map, vector等。
3, 初始化这个类成员,需要多条语句才能初始化,如需要for,条件判断。
2 代码设计
// A.h
#include <map>
class A {
public:
A();
static int getBool(int index); // 静态函数,开放接口访问map
private:
//只在类创建的时候,调用一次
static std::map< int, bool> contructData();
private:
// 只在类创建的时候,初始化一次
static const std::map<int, bool> m_data;
};
下面是函数定义
// A.cpp
const std::map<int, bool> A::m_data = A::contructData();
std::map<int, bool> A::contructData() {
std::map<int, bool> tempData;
for (int i = 0; i< 5; ++i) {
tempData.insert(std::pair<int, bool>(i+1, false));
}
return tempData;
}
2 进一步设计
显然,进一步增加需求,还可以完善代码:
1, 初始化的函数,不需要访问“类内”定义的常量。由于每个源码文件是一个编译单元,因此可以将该函数限制在当前的命名空间:
namespace {
std::map<int, bool> contructData() {
}
}
2,如果成员变量m_data只有函数"getBool()"访问,则可将该成员变量移入函数“getBool()”中进行创建.此时data依然只是创建一次。若使用const修饰,则无法改变map中的数据。
int A::getBool(int index) {
static const std::map<int, bool> data = contructData();
......
// do something
}
3 知识拓展
1, static const和const static 意义相同,没有区别。
2, 函数中的static变量,只初始化一次,当再次调用该函数,static变量不会再次被初始化。
3, static变量是复合对象,且其成员为指针,如下面形式,则const只是对std::map的修饰,即一经初始化,该map不能再做改变,但是其内容可以做出改变,map中的int*指向的数据依然可以被修改。
static const std::map<int *, int *> data
若想进一步控制map中内容也不被修改,可使用下面代码:
static const std::map<const int *, const int *> data