Chinaunix首页 | 论坛 | 博客
  • 博客访问: 548137
  • 博文数量: 119
  • 博客积分: 3391
  • 博客等级: 中校
  • 技术积分: 981
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-12 11:49
文章分类

全部博文(119)

文章存档

2014年(3)

2013年(1)

2011年(18)

2010年(27)

2009年(70)

我的朋友

分类: C/C++

2010-10-13 11:51:24

auto关键字
auto对象和变量被存储在栈中,它的生命周期仅存在于它的声明所在的块(block)中。在块中定义的块如果不加其它的修饰符则都是auto类型的。auto关键字可以省去。auto对象和变量对外部模块都是不可见的。

static关键字
它是C,C++中都存在的关键字,它主要有三种使用方式,其中前两种只指在C语言中使用,第三种在C++中使用。
(1)局部静态变量 
(2)外部静态变量/函数 
(3)静态数据成员/成员函数 
下面就介绍这三种使用方式

 一、局部静态变量 
与auto类型(普通)局部变量相比, static局部变量有三点不同: 
1. 存储空间分配不同,auto类型分配在栈上,属于动态存储类别,占动态存储区空间,函数调用结束后自动释放;而static分配在静态存储区,在程序整个运行期间都不释放。两者之间的作用域相同,但生存期不同。
2. static局部变量在所处模块的初次运行时进行初始化工作,且只初始化一次。
3. 对于局部静态变量,如果不赋初值,编译期会自动赋初值0或空字符;而auto类型的初值是不确定的。(对于C++中的class对象例外,class的对象实例如果不初始化,则会自动调用默认构造函数,不管是否是static类型) 


二、外部静态变量/函数 
在C中static有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了限制全局变量/函数的作用域,函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函 数)。注意此时,对于外部(全局)变量,不论是否有static限制,它的存储区域都是在静态存储区,生存期都是全局的。此时的static只是起作用域限制作用,限定作用域在本模块(文件)内部。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。 


三、静态数据成员/成员函数(C++特有) 
C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数。这是与普通成员函数的最大区别,也是其应用所在。比如在对某一个类的对象进行计数时,计数生成多少个类的实例,就可以用到静态数据成员。在这里面,static既不是限定作用域的,也不是扩展生存期的作用,而是指示变量/函数在此类中的唯一性。这也是“属于一个类而不是属于此类的任何特定对象的变量和函数”的含义。因为它是对整个类来说是唯一的,因此不可能属于某一个实例对象的。(针对静态数据成员而言,成员函数不管是否是static,在内存中只有一个副本,普通成员函数调用时,需要传入this指针,static成员函数调用时,没有this指针) 
注意:
不能将union成员声明为static的,然而,对于全局的匿名union,必须显式的声明为static。

register关键字
只有函数参数和局部变量可被声明为register。(注:另说,只能用于整形和字符型变量)

意思是,在可能的情况下,该变量被存储在CPU寄存器中。register变量和auto变量一样,它的生命周期只维持在它所声明的块中。编译器并不赞成程序员指定register变量。实际的情况是,编译器会根据全局优化的需要自动决定是否采用register类型。

extern关键字
extern用在声明语句中表示该对象或变量是在其它编译单元中(不能说是其它文件,因为有些文件,如头文件不是编译单元)定义的;如果用在定义语句中,表示该变量对外部可见。
注意extern与#include作用的区别:
例1,使用extern:
//out.h
int a = 10;

//out.cpp
#include "out.h"

//example.cpp
#include
using namespace std;

extern int a;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"a="<
system("pause"); 
return 0;
}
编译链接流程:
由于out.cpp文件引用了out.h文件,所以out.cpp文件的内容变成了int a = 10;,编译时生成编译单元out.obj(out.o),其中定义了变量a。example.cpp文件中出现了对a的引用cout<<"a="<

例2,使用#include:
//out.h
int a = 20;

//example.cpp
#include "out.h"
#include
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
cout<<"a="<
system("pause"); 
return 0;
}
编译链接流程:
example.cpp文件中出现了对a的引用cout<<"a="<


在此再说明另外一个关键字:volatile

禁止编译器对这个值做优化。 
一般的,系统使用这个数值的时候,如果发现他在寄存器中,就会使用这个值,不会从内存中读,这时候如果这个值在别的地方改变,则系统就会使用之前的数值,会出错;使用volatile告诉系统,使用这个值,无论他是否在寄存器中,都从内存重新读取
阅读(1246) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~