首页 > 代码库 > 作用域与命名空间
作用域与命名空间
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相同的特性,即它们只能作用于本编译模块中,
作用域与命名空间