一文了解C++函数产生的作用域对象

152 阅读2分钟

启掘金成长之旅!这是我参与「掘金日新计划 · 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++函数产生的作用域对象就聊这么多,最后还是请各位大佬多多指点。