C++中局部变量可以和全局变量重名吗?
这是一个作用域的问题。一个声明将一个名字引进一个作用域;局部变量(通常在函数中定义)的作用域是从声明的那一点开始,直到这个声明所在的块结束为止(一个块就是由{}围起来的一段代码)。全局变量(在所有函数、类、命名空间之外定义)的作用域从声明的那一点开始,直到这个声明所在的文件的结束。与全局变量重名的局部变量可以屏蔽全局变量,如果想在块内使用全局变量需要通过作用域解析运算符::引用。 见下例:
//global_local.cpp
#include <iostream>
using namespace std;
int x ;   //定义一个全局变量x
int main()
{
    int x ; //屏蔽全局变量x
    cout<< "Global x Initial value = "<< ::x << endl;
    cout<< "Local x Initial value = "<< x << endl;
    x = 5;          //对局部变量x赋值
    ::x = 6;      //通过作用域解析运算符::引用全局变量x,并且改变其值
    cout<< " After assignment Global x = " << ::x << endl;
    cout<< "After assignment Local x = " << x <<endl;
    return 0;
}
上述例子输出结果为:
Global x Initial value = 0
Local x Initial value = 11239412
After assignment Global x = 6
After assignment Local x = 5
从上面的例子还可以看出,如果没有显示初始化,那么全局变量、静态局部变量等静态对象会被自动初始化为适当类型的0,而局部对象(也称为自动对象)和在自由存储区里建立的对象(动态对象或者堆对象)将不会被初始化。

C++ 全局变量、局部变量、静态全局变量、静态局部变量的区别

全局变量、局部变量、静态全局变量、静态局部变量的区别

C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。

从作用域看:

全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

从分配内存空间看:
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

1)、静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
  2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

Tips:
  A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
  B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
  C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
    D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
    E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

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

static 全局变量:改变作用范围,不改变存储位置

static 局部变量:改变存储位置,不改变作用范围

静态函数 :在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数也称为内部函数。定义一个内部函数,只需在函数类型前再加一个“static”关键字即可。



C++中局部变量可以和全局变量重名吗?相关推荐

  1. 每日一题(30)—— 局部变量能否和全局变量重名?

    局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量. ...

  2. Java基础--成员变量和局部变量(区别、重名问题)

    成员变量和局部变量 注:所有的变量没有赋值是不能使用的!!! 两者的区别:定义的位置不同:成员变量:定义在类中成员位置的变量,称为实例变量 / 类变量,在类中方法外局部变量:定义在类中方法中作用范围不 ...

  3. android id 重名_android 中Xml里面的id重名问题

    今天在做项目的时候,居然发现@+id 居然可以重名,而且 情况一:同个一个Xml文件中的同名 在同个一个Xml文件的中若同名了,则前一个有效,而后一个无效,即后一个Null掉.如: android:i ...

  4. solidwork装配体导入到Adams中出现多个Part重名和Part丢失的情况处理

    1.首先,从solidwork装配体导入到Adams中,要按照下面这个篇博文所说的:要另存为两次Parasolid(.x_t)操作,第二点是每一次另存为都要把"平展装配体层次关系" ...

  5. 全局变量、局部变量、静态全局变量、静态局部变量的区别(与常见面试基础题)

    1.局部变量能否和全局变量重名?  答:能,局部会屏蔽全局.要用全局变量,需要使用 ":: "  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用 ...

  6. 全局变量和局部变量重名

    当局部变量和全局变量重名的时候,局部变量在其定义域的优先级更高,全局变量会自动被忽视,如果我们想要用到全局变量,我们可以在全局变量前加上::作用域运算符,因为C++里定义当缺省左侧对象时默认为全局变量 ...

  7. 局部变量能否和成员变量重名?

    局部变量可以和成员变量重名,不加"this"修饰时,优先使用最近的变量. public class Mainceshi {private String a = "成员变量 ...

  8. java变量重名问题

    变量重名问题 一个方法中不能定义两个同名的方法局部变量 方法中的局部变量也不能和形参同名 同一个方法的不同代码块可以重名 public static void methd(int b){//同一个方法 ...

  9. c语言静态成员变量重名会怎么样,C++中静态成员函数与静态成员变量(static )...

    C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用.如果有一些C++知识记不清楚了,它可以帮你很快回 ...

最新文章

  1. CentOS系统环境下安装MongoDB
  2. 关于临时表和表变量的差别1
  3. WIN 7下绑定网关MAC地址
  4. 基于LSTM的股票价格预测(完整金融类代码)
  5. 阿里云成为首个通过《面向公有云模式的政务云服务》测评的厂商
  6. oracle监听无法启动常用解决办法
  7. 面试官问我平时怎么看源码的,我把这篇文章甩给他了。
  8. Juniper Olive动态路由RIP配置案例
  9. date类型_Chapter 01. 常见数据类型概述 Overview of Common Data Types
  10. BT.1120协议简介
  11. 【钉钉-场景化能力包】家校沟通
  12. python中文乱码解决
  13. Android 9 禁用按住电源键+音量加键进入工厂测试(recovery模式)功能
  14. AbstractApplicationContext的refresh方法
  15. 混合溶剂中的高分子凝胶中的渗透压的一般计算
  16. 中国象棋---棋盘/棋子
  17. 自定义小程序中的showToast
  18. 没什么经验的UE/UI设计师如何应对面试
  19. 计算机组成原理课程设计报告书
  20. LTE传输模式(TM1 - TM9)

热门文章

  1. 单片机脉宽测量C语言,单片机脉宽测量的程序
  2. java.io.eof_java.io.IOException: java.io.EOFException: Unexpected end of input stream错误
  3. 系统启动数据库服务器,linux系统如何启动数据库服务器
  4. 打开excel文件并写入_双击Excel表格文件时只打开程序不能直接打开文件
  5. linux 卸载ava,linux下配置ava环境变量.doc
  6. 这种制作PCB板的方法,只需要一分钟!
  7. python random包含尾部吗_你真的了解Python的random模块吗?
  8. oracle 云 BI,[Oracle]见习BI工程师之函数
  9. lacp静态和动态区别_lacp静态与动态区别
  10. java 当一个文本框有值时另一个文本框置灰_【农行DevOps进行时】基于PaaS的持续集成/持续交付实践 | IDCF...