C++老鸟日记012 变量作用域

版权声明

---------------------------------------------------------------------------------------------------------------------

该文章原创于Qter开源社区(www.qter.org

作者: 女儿叫老白 (白振勇)

转载请注明出处!

---------------------------------------------------------------------------------------------------------------------

课程目录:《C++老鸟日记》目录

本套课程属于:《C++跨平台开发干货》系列课程。

----------------------------------------------------------------------------------------------------------------------

(3.5, 3.6)。

变量的作用域存在于离它最近的一对括号{}。C++中,我们可以在作用域的任意位置定义变量,比如在for循环中,但是一定要注意,变量的命名务必有含义,避免采用int i之类的定义。因为在循环体中我们也可能会用int i。这样就极有可能同循环体之外的int i产生混淆,导致代码运行时出现我们期望之外的结果。

       全局变量是可以在一处定义,然后在其他cpp中也可使用的变量。全局变量定义于函数体之外,且不受作用域的影响,在程序的整个生命周期内都有效。使用extern声明一个变量是全局变量。

       // a.cpp

       int g_ConfigCount = 0;

 

       // b.cpp
       extern int g_ConfigCount;

       如果我们在函数体之外定义一个变量x,但是又不希望在其他cpp中看到x,那么就可以用静态变量:

       // c.cpp

       static double s_Zero = 0.0001f;

       // d.cpp

       extern double s_Zero; // error! 编译错误

 

       在函数体内部定义的static变量,表示该变量在内存中常驻且只初始化一次,变量生存期不受函数堆栈的影响。既然只初始化一次,那么在变量定义时就必须初始化。

       // e.cpp

       int parseFile(const string& strFileName)

{

       static int s_successCount = 0;

       ……

       if (…) {

              s_successCount ++;

}     

}

但是全局变量或者静态变量的初始化是跟编译器相关的,不受编程人员的控制,有时候它的初始化可能出现意想不到的结果。我就碰到过文件作用域内的静态变量初始化两次的情况,这是有问题的,会导致程序出现不可预知的结果。因此如果使用 static定义文件作用域的静态变量,请使用全局锁进行保护(不能用类的成员锁),比如:

       // f.cpp

       CMutex g_mtx;      // 全局锁,不能用类的成员锁。

      

       CMyClass& CMyClass ::getInstance() {

              g_mtx.lock();

              static CMyClass obj;

              return obj;

              g_mtx.unlock();

}

-------------------------------- 总结  --------------------------------------

1. 变量的作用域存在于离它最近的一对括号{}。

2. 变量命名要规范,避免使用i、j、k等名称。循环体内外避免变量重名。

3. static变量可以用在文件作用域内,仅在某个文件内可见。

4. 全局变量初始化过程可能不可预测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

女儿叫老白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值