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.系统区:存 ...
随机推荐
- WinForm程序用使用List对象绑定DataGridView数据源
1. 在用List<T>对象绑定DataGridView数据源属性的时候,数据源的内容不会动态更新,如果List<T>对象集合中的数据发生变化,那么数据控件的数据源是不会得到更 ...
- MSSQL Server Transaction 数据库事务回滚的用法
使用的表结构如下: Commit TransAction Else Rollback TransAction/* 自定义一个变量来判断最后是否发生过错误.*/ ...
- Heavily reliance on forensic tools is risky
We could take advantage of forensic tools to examine and analyze the evidence, but heavily reliance ...
- Android IOS WebRTC 音视频开发总结(六三)-- 2016国内IM云服务行业分析
本文主要国内IM云服务行业分析,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 谈到IM我们最先想到的是qq和微信 ...
- 《Linux运维趋势》2010-2013年全部期刊下载
<Linux运维趋势>2010.rar <Linux运维趋势>2011_上.rar <Linux运维趋势>2011_下.rar <Linux运维趋势>2 ...
- asp.net webuploader粘贴,拖拽,点击上传图片
demo.html代码:<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...
- Linux下CPU占用率高分析方法
一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用1. 通过top命令找到可疑进程PID top - 09:37:18 up 70 days, 16:29 ...
- CentOS编译安装lamp
LAMP环境搭建(编译安装CentOS+httpd2.2+mysql5.5+php5.4) 首先准备以下压缩包 <ignore_js_op> (1)编译安装apache 1.配置防火墙,开 ...
- IOS基础——IOS学习路线图(一)
一.一个月 1.OC语法基础. 2.KVC和KVO 3.IOS UI基础 4.UI表视图与集合视图 5.UIStoryboard和autoLayout 6.Ipad API 二.10天 7.静态页面考 ...
- 室内净化ThinkPHP复习
"$_GET[id]"这个是和$_GET['id']一样的 foreach的是 name 和 item if(!empty($_GET['id'])){ $where.= &quo ...