您的位置:首页 > 编程语言 > C语言/C++

C++变量存储方式浅析

2015-08-24 20:07 399 查看
在《C++PrimerPlus》一书中说C++变量有三种特性,分别是:持续性、作用域和链接性。但是按我的理解,我觉得应为两种特性:持续性和作用域。持续性就是变量在内存中保存的时间;作用域(scope)描述了变量在多大的范围内可见。至于书中所说的链接性(描述了该变量能不能在不同文件间共享,链接性为外部的变量可在文件间共享,没有链接性的变量则不可),即能否在其他文件中使用该变量,也可归为作用域。

按这两种属性的不同,变量可以分为如下几种:

1 持续性:自动变量,作用域:代码块

使用如下:

int main()
{
int temp = 0;
for(int i = 0;i < 10;i++)
temp++;
...

return 0;
}


在以上代码中,temp就是自动变量(当然i也是),它持续性直到代码块运行结束从内存中释放,作用域是它所在的代码块。

值得一提的是,自动变量如果在子代码块中也有定义,则越是局部定义的变量越具有优先使用的特性。

int main()
{
int temp = 0;
int i = 10;
for(int i = 0;i < 10;i++)
temp++;
...

return 0;
}


在上面的代码中,for语句前面定义的i会因为for语句定义的i而在for语句中隐藏,在这个子代码块中优先使用子代码块定义的变量。

2 寄存器变量

寄存器变量比较特殊,它建议编译器使用CPU内部的寄存器来存储自动变量,使用关键字register定义,持续时间以及作用域和1型变量相同。(但在C++11中已经没有此用法,还作为关键字存在更多是为了兼容以前的程序)

用法如下:

register int count_fast;


3 持续性:静态 作用域:代码块

使用方法如下:

int fun(int x);
int main()
{
int temp1 = 10;
int temp2 = 5;

fun(temp1);
...
fun(temp2);
...

return 0;
}

int fun(int x)
{
static int num = 0;
for(int i = 0;i < x;i++)
num++;
}


在以上代码中num是作用域为fun函数代码块的一个static变量,num只能在fun函数中使用,它和没有关键字static的变量区别是:num只在第一次调用fun时把num初始化成0,当fun不运行时num也在内存中保存,下次调用时num不再执行初始化语句,直接使用上次调用后保留的值。

4 持续性:静态 作用域:当前文件

使用如下:

//file1
static int temp = 20;
...

//file2
int temp = 7;
...


若使用此种变量,必须在函数外部定义,不能定义于任意一个代码块之内,关键字static的使用使temp只限定于当前文件使用,不能被其他文件所使用,file2中的定义不会影响file1中temp的值。

5 持续性:静态 作用域:所有工程下的文件

定义方法:

//file1
extern int number1 = 20;
int number2 = 30;
...


在其他文件中使用这两个变量:

//file2
extern int number1;
extern int number2;
...


同样的,需要把这个类型的变量定义到函数外边,在定义中关键字extern不是必须的,number2在file2中同样可以使用。但是在file2中声明全局变量时必须用关键字extern。另外,全局变量必须在定义的时候进行初始化,在file2中声明外部全局变量时不能同时对变量赋值,编译器会认为是定义了两个重名的变量而报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: