作用域与命名空间

Posted PyMCJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作用域与命名空间相关的知识,希望对你有一定的参考价值。

http://blog.csdn.net/touzani/article/details/1637776 介绍命名空间;

http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html  详细介绍了extern和static的区别

http://blog.csdn.net/duan19920101/article/details/50989431  内存分配方式

1.C++内存分配方式:

栈:

就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等

堆:

由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。堆可以动态地扩展和收缩。

自由存储区:  (堆和自由存储区的区别很微妙,很多编译器的new的缺省操作都是通过malloc来进行操作的,也就用自由存储区来实现堆,但两者在物理介质上有什么区别还需要进一步考证。)

由 malloc 等分配的内存块,他和堆是十分相似的,不过它是用 free 来结束自己的生命的。

全局/静态存储区:

全局变量和静态变量被分配到同一块内存中

常量存储区:

存储一推不可更改的常量

 

堆和栈在使用的时候要注意其大小和使用效率,同时都要注意不能有越界现象

 

 

2.命名空间

1.C++标识符的作用域:代码块,类,全局,命名空间。

2.命名空间可以嵌套,但是不能只申明。

3.using指令和using申明,using namespace xxxx为指令,使用指令更方便,一劳永逸,但是在多个命名空间同时使用时

会导致编译器定位错误,同时编译器不会报任何错误,所以using申明更加安全,一个命名空间内若有多个函数被重复调用,则先申明这几个参数

 

3.作用域:

作用域分类:代码块 文件作用域 函数原型作用域 类作用域 名称空间(文件作用域实际上是名称空间的一个特例)

局部变量:块作用域
全局变量的作用域: 全局变量不受作用域影响,全局变量的生命期一直到程序结束
静态变量(static):作用域为局部或者全局取决于它是如何被定义的,如果定义在代码块内,则在第一次调用的时候初始化,从第一次初始化后到程序结束一直存在。通常,函数中定义的局部变量,在函数体执行完毕后会释放存储空间,当再次调用这个函数时,会重新创建变量的存储空间。
外部变量(extern):外部变量的作用域可以为多个文件,以标识变量或者函数的定义在别的文件中,extern申明的变量,编译器会知道其可你的那个作为全局变量存放在某处。
const常量:告诉编译器“这是不会被改变的”,改变了则编译器报错

 

4.extern变量与static变量

http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html

extern申明外部变量有两种用法:

1)extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被外部文件引用,就放在*.h中并用extern来声明。

也就是说 *.h 里用extern申明 同时 *.c里面也要申明  这样在申明外部函数的时候,也防止被调用的文件突然改变函数变量引起一些错误

2)在A.cpp里面定义一个int exp=5  在B.cpp里面申明一下 extern int exp;就可以使用exp变量了

 

静态存储(全局变量和静态变量)分为外部链接,内部链接 和无链接    上面4 1)就是静态存储的外部链接

但是只要是用static修饰的静态变量都是内部链接,因为用static修饰的变量都会申明加定义,比如你在A.h里面定义和申明一个静态变量 b.cpp和c.cpp都#include "A.h",他们同时使用static修饰的变量,但其实是使用的两个不同的静态变量,也就是说虽然它们有相同的内容,但是存储的物理地址并不一样,static修饰全局变量的作用域只能是本身的编译单元.

 

const 加extern 就相当于继承extern的特性 单独使用时,相当于static特性。const修饰的全局常量据有跟static相同的特性,即它们只能作用于本编译模块中。

 

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

 

以上是关于作用域与命名空间的主要内容,如果未能解决你的问题,请参考以下文章

作用域与命名空间

python函数的动态传参.作用域与命名空间

C# 常用 命名空间都有哪些 这些命名空间是的作用是?

命名空间

命名空间 作用域

python进阶之命名空间与作用域