启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情
在C++的学习过程当中,除了常规的语句之外还有流程控制语句和函数等语句块,二者都是可以重复使用的代码结构,都有自己的语句块,那么这里就涉及到了一个问题,变量起作用的范围,所以我们来聊聊C++的函数产生的作用域对象吧。
作用域
在C++当中,定义名字是有作用域的,作用域:就是变量起作用的范围,作用域是程序的一部分,在其中变量名有器特定的含义,同一个变量名在不同的作用域当中可以指向不同的实体,C++的作用域通常是通过花括号进行分割的。在讨论作用域需要关注的2个点:
1、变量声明的时间节点。
2、变量被销毁的时间节点。
同时要注意的是C++当中当看到一个变量之后,如何查找他的值,这个过程是有内到外,由近及远的,比如:
#include <iostream>
using namespace std;
int num = 2,num1 = 2;
void fun(){
int num = 3;
cout << num << " " << num1 << endl;
}
int main(){
fun();
return 0;
}
这里在脚本所有的函数外部定义了一个int类型的num,在fun当中也定义了一个int num,当在函数当中调用num时,率先会从自己所在的作用域当中查找变量指向的实体,如果不存在再向上一级的作用域查找,所以这里输出的num是3,num2是2。
自动对象
在函数当中又一种特殊的对象,叫做自动对象,当函数的控制路径经过对象定义语句的时候创建对象,当到达语句块末尾的时候销毁对象。这种只存在于块执行期间的对象称为自动对象,他的作用域在函数语句块的内部,当函数语句块执行完成,这个对象也就变成未定义的了。
最常见的自动对象就是函数的形参,函数开始的时候为形参申请存储空间,函数执行结束,形参也就被销毁了。
#include <iostream>
using namespace std;
void fun(int num,int num1){
cout << num << " " << num1 << endl;
}
int main(){
fun(1,2);
return 0;
}
这里的num和num1就是形参,在函数执行的时候,开始申请空间,然后又实参初始化形参,在函数体内部可以使用num和num1,随着函数执行结束,num和num1也被销毁了。
局部静态对象
上面说的自动对象其实就是一种局部对象,在语句块当中声明的对象一般来说都是局部对象,但是在有些情况下,函数内部声明的对象想要在函数语句块外部也生效,也就是在语句块执行完成之后不被销毁接着使用,那么就有了局部静态对象,局部静态对象需要使用static来声明。
#include <iostream>
using namespace std;
int fun(){
static int num = 1;
return num ++;
}
int fun1(){
int num = 1;
return num ++;
}
int main(){
for(int i = 0; i < 10; i++){
int result = fun();
int result1 = fun1();
cout << result << endl;
cout << result1 << endl;
}
return 0;
}
这里,fun函数当中声明的num使用了static关键字,所以在main当中,每次循环可以使用到上一次的值,得到的结果是一个从1到10的结果,而fun1当中是一个常规声明的num,在函数语句块执行的时候生成,执行完成销毁,下次执行从新生成,执行完成再次销毁,所以十次结果都是1。
关于C++函数产生的作用域对象就聊这么多,最后还是请各位大佬多多指点。