作用域、生命期和程序的组织结构-创新互联
在函数内部或复合语句中定义的变量,称为局部变量(local variable)。
站在用户的角度思考问题,与客户深入沟通,找到西固网站设计与西固网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站建设、网站设计、企业官网、英文网站、手机端网站、网站推广、主机域名、虚拟空间、企业邮箱。业务覆盖西固地区。(1)在一个函数内部定义的变量;
(2)函数的形式参数;
(3)在某个复合语句中定义的变量。
a. 局部变量只能定义在它的区域及其子区域中使用。
b. 在同一个区域中不能定义相同名字的变量。
c. 在不同区域中允许定义相同名字的变量,但本质上它们是不同的变量。
d. 如果一个变量所处区域的子区域中有同名的变量,则该变量在子区域无效,有效的是子区域的变量,称为定义屏蔽。
在源文件中,但在函数外部定义的变量,称为全局变量(global variable),全局变量的有效区域是从定义变量的位置开始到源文件结束。
函数之间数据传递尽量可以利用全局变量,如此也会导致两个函数彼此分不开,违背模块化的原则,因此结构化程序设计提倡少用或不用全局变量。
二、作用域C++的实体通常有三类:(1)变量或对象;(2)函数;(3)类型。
作用域是程序中的一段区域。在同一个作用域上,C++程序中每个名字都与唯一的实体对应;如果在不同的作用域上,程序中可以多次使用同一个名字,对应不同作用域中的不同实体。
(1)文件作用域;(2)函数作用域;(3)块作用域;(4)类型声明作用域;(5)函数原型作用域。
实体在作用域内可以使用称为可见(visible),又称有效。可见的含义是指实体在作用域上可以使用。
规则一:同一个作用域内不允许有相同名字的实体,不同作用域的实体可以有相同名字。
规则二:实体在包含它的作用域内,从定义或声明的位置开始,按文件行的顺序往后(往下)直到该作用域结束均是可见的,包含作用域内的所有子区域及其嵌套。
规则三:若实体A在包含它的作用域内的子区域中出现了相同名字的实体B,则实体A被屏蔽。
规则四:可以使用extern声明将变量或函数实体的可见区域往前延伸,称为前置声明(forward declaration)。
规则五:在全局作用域中,变量或函数实体若使用static修饰,则该实体对于其他源文件是屏蔽的,称为私有的(private)。
三、生命期C++中,每个名字都有作用域,即可以使用名字的区域,而每个对象都有生命期(lifetimes),即在程序执行过程中对象存在的时间。
1. 动态存储
程序运行期间,系统为对象动态地分配存储空间。存储空间的分配和释放是动态的,或者由函数调用来自动分配(自动存储),或者由程序指令来人工分配释放(自由存储),其生命期是整个程序运行期的一部分。
对象不持久地占有存储空间,释放后让出空闲空间给其他对象的分配。
2. 静态存储
对象在整个程序运行期持久占有存储空间,其生命期与程序运行期相同。其特点是对象的数据可以在程序运行期始终保持直到修改为止,或者程序结束为止,静态存储的分配和释放在编译完成时就决定好了。
现代程序设计的观点是,除非有必要尽量少地使用静态存储。
3. 自动对象
默认情况下,函数或复合语句中的对象(包含形参)称为自动对象,其存储方式是自动存储,程序中大多数对象是自动存储。
auto 类型 变量名[=初值]
4. 寄存器变量
C++语言允许CPU的寄存器来存放局部变量,称为寄存器变量。
register 类型 变量名[=初值]
5. 静态局部对象
在局部对象的前面加上static存储类别修饰用来指明对象是静态局部对象,
static 类型 变量[=初值]
四、内部函数与外部函数1. 内部函数
函数本质上是全局的,在多文件的程序中,在连接时会检查函数在全局作用域内是否名字唯一,如果不是则出现连接错误。
在函数定义前加static修饰,则函数称为内部函数,定义形式为:
static 返回类型 函数名(形式参数列表)
{
函数体;
}
内部函数仅在包含它的文件中有效。
该函数在逻辑上仅限定在一个文件中使用,其他文件不会用到。而且希望在连接检查时永远不可能出现该函数名不唯一的连接错误,这在多人编写同一个程序的软件开发模式中是常用的策略。
2. 外部函数
在函数定义前加上extern声明,则函数称为外部函数,定义形式为:
extern 返回类型 函数名(形式参数列表)
{
函数体
}
C++中所有的函数本质上都是外部函数,extern都可以省略。
五、头文件与工程文件六、多文件编译编译器:g++
过程:源文件、预处理、编译、汇编、链接、可执行文件
多文件
(1)
a.h
#ifndef A_H__
#define A_H__
double fsin(double x);
#endif
a.cpp
#include#include "main.h"
#include "a.h"
double fsin(double x)
{
return sin(x*PI/180.0);
}
(2)
b.h
#ifndef B_H__
#define B_H__
double fcos(double x);
#endif
b.cpp
#include#include "main.h"
#include "b.h"
double fcos(double x)
{
return cos(x*PI/180.0);
}
(3)
c.h
#ifndef C_H__
#define C_H__
double fsqrt(double x);
#endif
c.cpp
#include#include "c.h"
double fsqrt(double x)
{
return sqrt(x);
}
(4)
main.h
#define PI 3.1415926535
main.cpp
#includeusing namespace std;
#include "a.h"
#include "b.h"
#include "c.h"
int main()
{
char n;
double x;
cin >>n >>x;
if(n == '1')
cout<< "sin(x) = "<< fsin(x)<< endl;
else if(n == '2')
cout<< "cos(x) = "<< fcos(x)<< endl;
else if(n == '3')
cout<< "sqrt(x) = "<< fsqrt(x)<< endl;
else
cout<< "error"<< endl;
return 0;
}
(5) makefile
main:main.o a.o b.o c.o
g++ main.o a.o b.o c.o -o main
main.o:main.cpp
g++ main.cpp -c -o main.o
a.o:a.cpp
g++ a.cpp -c -o a.o
b.o:b.cpp
g++ b.cpp -c -o b.o
c.o:c.cpp
g++ c.cpp -c -o c.o
clean:
rm *.o main -rf
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
新闻标题:作用域、生命期和程序的组织结构-创新互联
浏览地址:http://hbruida.cn/article/gghij.html