C++变量的存储类别与作用域
总结一下C++中变量的存储类别以及变量的作用域。
(1)标示符的存储类别决定了标示符在内存中存在的时间(我们可以理解标示符就是确定一个变量的符号,也就是我们所说的变量名)
二:存储类别
(1)静态存储类别:静态存数类别变量(我们简称静态变量),从程序的开始处就存在,其生命期伴随整个程序。
(2)自动存储类别:当变量时自动存储类别时,变量在进入到定义它们的程序快时定义它,在离开它们所在的程序块(作用域)时销毁它,因此成为自动变量。其中关键字auto和register用来声明自动类型的变量,
三:自动存储类型:
(1) 只有在函数中的局部变量才是自动存储类型的,我们在MAIN函数中定义的变量一般都是自动变量,关键字auto可以不写,默认情况局部变量就是自动变量(我们把自动存储类别的变量叫自动变量)如下图:
int a;
int b;
都是自动变量
(2)自动变量还有一种寄存器变量,既使用关键字register,我们把经常被调用的变量声明为寄存器变量,顾名思义,让变量存在于寄存器中,达到更加快速的存储,这个我们了解即可,现在很多编译器带有可以识别频繁使用变量的功能,不需要程序员手动设置。
根据最小特权原则,我们应该定义自动变量。代码应该只被赋予它仅能完成设计任务的权限,无需更多权限。
四:静态存储类别
(1)关键字extern和static用于静态存储类别的变量,静态存数类别变量(我们简称静态变量),从程序的开始处就存在,其生命期伴随整个程序,一直存在程序的执行过程,但是:即便是静态变量,也并不意味着这些变量(专业来说叫:标识符),在整个程序都是能用的(或者说是可以访问的),这一点在下面有专门的实例。
(2)对于静态变量,许多被误认为和全局变量一致,这一点是错误的,static变量仅仅在变量的作用范围内可见,而全局变量是在所有地方都可见的,这就是static变量与全局变量的区别,我们要纠正一点:存储类别(存数类型)和变量的作用域是两个独立的问题。
我们应该遵循最小特权原则,不去使用全局变量。
(3)我们解释一下,全局变量和静态变量的区别:全局变量是不显示用static修饰的全局变量,但全局变量默认是静态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。
全局静态变量是显示用static修饰的全局变量,作用域是所在的文件,其他的文件即使用extern声明也不能使用。
五:标识符(变量)的作用域
(1) 程序中可以使用标识符的范围成为标识符 的作用域,其中我们称标识符为变量,更加专业。例如:我们在一个语句块中声明了一个局部的变量,那么只能在该语句块中使用该变量。
(2)其中作用域大致分为四个:
l 全局作用域:此变量对于从其声明处到文件结束,都是已知的。
l 局部作用域:一个语句块中声明的变量,其作用域在于该语句块中。
l 函数原型作用域:就是函数的形参列表中。
这里着重标记一下局部作用域:当语句块是嵌套的,并且外层语句块中的一个标识符和内层语句块中的标识符名字一致时,外层语句块中的标识符被隐藏,直到内层语句块结束。
六 注意:
(1)我们应该避免使用全局变量,使用全局变量可能在不需要访问变量时却错误的访问变量,违反最小特权原则。仅用于特定函数中的变量应该声明为那个函数的局部变量,而不是全局变量。
(2)应该避免使用会隐藏在外部作用域中名称的变量名,这可以通过在程序中避免使用相同的标识符。
上述总结说明了变量的类型以及作用域,此时我们举个程序,列举上述出现的情况。如下:
#include<iostream>
using namespace std; void use_Global(); //声明函数
void use_Local();
void use_Static_Local(); int a=1; //在函数外定义一个全局的变量 int main()
{
cout<<"the value of global a in the main function is "<<a<<endl;
//<span style="color:#ff0000;">输出全局变量的值,值为 1</span> int a=10; //在MAIN函数中定义一个同名字的局部变量
cout<<"now ,in the main function , local a is "<<a<<endl;
//<span style="color:#ff0000;">输出局部变量,此时全局变量被隐藏,此时的输出的值为 10</span> { //在语句块中定义局部变量
int a=7;
cout<<"int the scope ,local a is "<<a<<endl; //<span style="color:#ff0000;">输出值为:7</span>
}
cout<<"local a in the main's outer scope is"<<a<<endl;
//<span style="color:#ff0000;">脱离语句块,输出变量,输出值为:10</span> use_Local(); //使用函数,函数中定义一个局部变量
use_Static_Local(); //使用函数,函数中定义一个静态局部变量
use_Global(); //使用函数,函数中使用全局变量 use_Local();
use_Static_Local();
use_Global(); return 0;
} void use_Global()
{
cout<<"\n global a is "<<a<<endl;//<span style="color:#ff0000;">此作用域中,没有定义同名的标识符,所以输出的全局变量,值为10</span>
cout<<"enter the use_Global function "<<endl;
a++;
cout<<"\n global a is "<<a<<" on the exit "<<endl;
}
void use_Local()
{
int a=20;
cout<<"enter the function use_Local, the a is "<<a<<endl;
a++;;
cout<<"exit the function use_Local, the a is "<<a<<endl;
}
void use_Static_Local()
{
static int a=5; //定义静态变量,函数调用结束后,仍存在,但是仅在此函数中可以调用,脱离此作用域,就不行。
cout<<"enter the function use_Static_Local, the a is "<<a<<endl;
a++;;
cout<<"exit the function use_Static_Local, the a is "<<a<<endl;
}
C++变量的存储类别与作用域的更多相关文章
- c语言 变量的存储类别以及对应的内存分配?
<h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程 ...
- C语言变量的存储类别
我们知道,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量. 从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期 ...
- [C++程序设计]变量的存储类别
全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储单元,程序执行完毕就释放这些空间.在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放. 在动态存储区中存放以下数据: ...
- c++ 变量的存储类别
c++的存储类别 首先我们得知道c++的变量存储方式:静态存储和动态存储两种,全局变量使用的是静态存储,函数的形参和局部变量是使用的动态存储. 当然在有的教程中又分为自动存储,静态存储,动态存储.相信 ...
- C++变量作用域、生存期、存储类别
写C.C++代码的小伙伴一定在头疼变量的作用域.生存期.存储类别问题.什么静态.外部.寄存器.局部.全局搞得一头雾水.今天咱们就来梳理一下他们的变态关系(什么不得了的事情???) 1.变量的作用域 说 ...
- C++变量存储类别和内存四区
变量存储类别 变量声明/定义的一般形式: 存储类别 数据类型 变量名 存储类别指的是数据在内存中存储的方法.存储方法分为静态存储和动态存储两大类.标准C语言为变量.常量和函数定义了4种存储类型:ext ...
- C语言变量、函数的作用域及变量的存储方式
一.变量的作用域和存储方式 在C语言中每个变量都有两种基本属性:数据类型.数据的存储类别. 数据类型很多人都已熟知,例如:字符型(char).整型(int).浮点型(float)等等.存储类别是指数据 ...
- [转]深入探讨C语言中局部变量与全局变量的作用域与存储类别
C语言中局部变量和全局变量变量的作用域与存储类别(auto,static,extern,register) 1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元, ...
- C语言杂谈(三)存储类别
本文讨论C语言中的存储类别,包括数据在内存的存储.变量的存储类别.函数的存储类别.生存周期.下图为计算机的存储空间,有寄存器和内存. 一.存储区域 1.寄存器:存放立即参加运算的数据. 2.系统区:存 ...
随机推荐
- zz
婚恋新现象 杭州男为何更愿意娶外地女孩?-浙江新闻-浙江在线 剩男三无
- HTML+css实现图片全屏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ajax success 和complete 的区别
Function) success - 当请求成功时调用的函数.这个函数会得到一个参数:从服务器返回的数据(根据“dataType”进行了格式化). Function) complete - 当请求完 ...
- C# Socket网络编程精华篇(转)
我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本 ...
- hbase日常操作及维护
一,基本命令: 建表:create 'testtable','coulmn1','coulmn2' 也可以建表时加coulmn的属性如:create 'testtable',{NAME => ' ...
- Android IOS WebRTC 音视频开发总结(二十)-- 自由职业
咋看标题感觉与WebRTC和音视频无关,其实有着很大的关联,文章来自博客园RTC.Blacker,转载请说明出处. 背景: 一方面因为对开发人员比较了解,不喜欢约束,喜欢自由自在,所以我们向往自由职业 ...
- SE11
自省数据及表存储 2014年4月6日 21:37 类似JAVA反射的特性 SAP提供自省数据的机制 这样可以保证程序的灵活性和动态性 1.使用OO中的cl_abap_typed ...
- 可自定义导航条功能案例ios项目源码
可定制的navigationitem ,当我们使用系统的方法设置navigationItem的leftItem或者rightItem时,我们会 发现item位置会有偏差(左边的偏右,右边的偏左).当设 ...
- 爱之初体验---编译加载内核模块hello
1. hello.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h ...
- POJ C++程序设计 编程题#2 编程作业—文件操作与模板
编程题#2: 实数的输出格式 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 1000kB 描述 ...