在C代码中extern关键字修饰变量很常见,而在真正的C++代码中extern关键字修饰变量却很少见。
extern修饰变量: 表明该变量在别的地方已经定义过了,在这里要修改或使用这个变量。
一、C的编码习惯小例子:
(1) 在test1.h中有下列声明:
#ifndef TEST1H
#define TEST1H
extern char g_str[]; // 声明全局变量g_str
void fun1();
#endif
(2) 在test1.cpp中
#include "test1.h"
char g_str[] = "123456"; // 定义全局变量g_str
void fun1() { cout << g_str << endl; }
(3) 在test2.cpp中
#include "test1.h"
void fun2() { cout << g_str << endl; }
二、把上边的例子改造成C++习惯代码
(1) test1类
test1.h
class Test1{
private:
char str[] = "123456";
int flag = 0;
public:
void Fun1();
char *GetStr();
void SetFlag(int value);
int GetFlag();
};
test1.cpp
#include "test1.h"
void Test1::Fun1()
{ cout << str << endl; }
char *Test1::GetStr()
{
return str;
}
void Test1::SetFlag(int value)
{
flag = value;
}
int Test1::GetFlag()
{
return flag;
}
(2) test2类
test2.h
class Test2{
public:
Test2();
~Test2();
void Fun2();
void Fun3();
public:
Test1 *pGlobalVeriable_;
};
test2.cpp
#include "Test2.h"
Test2::Test2()
{
pGlobalVeriable_ = new Test1();
}
~Test2::Test2()
{
}
void Test2::Fun2()
{
//cout << str << endl;
cout << pGlobalVeriable_->GetStr() << endl; //通过test1的对象指针调用成员函数来获取test1类中的str 的值
}
void Test2::Fun3()
{
cout << pGlobalVeriable_->GetFlag() << endl; //通过test1的对象指针调用成员函数来设置获取test1类中的flag的值
pGlobalVeriable_->SetFlag(5);
cout << pGlobalVeriable_->GetFlag() << endl;
}
(3)test3类
如果类test3 想与类test2中这个test1类对象同步,可以在test2类中,实例化test3类对象时,把对应的test1类对象指针传进来:
test3.h
class Test3{
public:
Test3(Test1 *GlobalVeriable); // 实例化时,传入类test1实例化对象指针
~Test3();
void Fun3();
void SetGlobalVeriable(Test1 *GlobalVeriable);
public:
Test1 *pGlobalVeriable_;
};
test3.cpp
#include "Test3.h"
Test3::Test3(Test1 *GlobalVeriable)
{
SetGlobalVeriable(GlobalVeriable);
}
~Test3::Test3()
{
}
void Test3::SetGlobalVeriable(Test1 *GlobalVeriable)
{
pGlobalVeriable_ = GlobalVeriable;
}
void Test3::Fun3()
{
cout << pGlobalVeriable_->GetFlag() << endl;
pGlobalVeriable_->SetFlag(7);
cout << pGlobalVeriable_->GetFlag() << endl;
}
题外话:
本人是写一直C代码,最近在纯C++代码基础上加一个一部分功能,开始为了简单用extern关键字修饰变量,把
功能基本完成了,但在纯C++代码中看着这几个extern关键字越看越别扭,决定用C++的习惯改一下。
本人感觉C有C的好处:简单直白,容易实现,其实extern声明的变量也可以统一管理,这样跟C++就有点类似了;
C++有C++的好处:委婉含蓄 ,繁琐一些,代码多了可读性也不会下降;
在项目过程中我之所以没有把extern声明变量没有用统一管理的方法,就是想保持原来代码工程C++统一的代码风格。
仅个人观点,各有个的好处,O(∩_∩)O~