以一种更安全,更健壮的方式来表示全局变量的方法,是将其封装成全局变量类,主要涉及以下的知识点:
- C++类
- 类中static成员变量
- 类中static成员函数
- 类中的成员函数会被自动视为inline内联函数
- 用pass-by-reference-to-const代替pass-by-value(Effective C++条款20)
- 全局变量没有赋值会被默认为0或空
示例:全局变量的一般写法
string program_name;
string version_stamp;
int version_number;
int tests_run;
int tests_passed;
改写成全局变量类进行管理:
class globalWrapper{
public:
// 只能通过function member接口调用,将数据隐藏
static int test_passed(){
return _tests_passed;
}
static int tests_run(){
return _tests_run;
}
static int version_number(){
return _version_number;
}
static string version_stamp(){
return _version_stamp;
}
static string programe_name(){
return _program_name;
}
static int test_passed(){
return _tests_passed;
}
// 提供可修改的function member
static void tests_run(int nval){
_tests_run = nval;
}
static void version_number(int vnal){
_version_number = vnal;
}
static void version_stamp(const string& nstamp){
_version_stamp = nstamp;
}
static void programe_name(const string& npn){
_program_name = npn;
}
private:
// 希望每个全局变量都仅有一个,所以定义为static member
static string _program_name;
static string _version_stamp;
static int _version_number;
static int _tests_run;
static int _tests_passed;
};
// 定义示例,注意这里只能定义全局变量,如果放在main函数里面就不能访问!
string globalWrapper::_program_name;
string globalWrapper::_version_stamp = "ok";
int globalWrapper::_version_number;
int globalWrapper::_tests_run;
int globalWrapper::_tests_passed;
int main(){
// 修改全局变量的值
globalWrapper::tests_run(10);
globalWrapper::programe_name("wangqiang");
// 打印当前调用变量值
cout<<globalWrapper::tests_run()<<endl;
cout<<globalWrapper::programe_name()<<endl;
cout<<globalWrapper::version_stamp()<<endl;
return 0;
}