最近在C++ 中用到extern关键字的一点点感悟


在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~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值