作用域、生命期和程序的组织结构-创新互联

一、局部变量和全局变量

在函数内部或复合语句中定义的变量,称为局部变量(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