代码改变世界

C++第三次作业

2019-09-29 20:13  艾伦爱尔敏  阅读(129)  评论(0编辑  收藏  举报

作用域

作用域是一个标识符在程序正文中有效的区域。C++中标识符的作用域有函数原型作用域、局部作用域(块作用域)、类作用域等。

1.函数原型作用域

在函数原型声明时形式参数的作用范围就是函数原型作用域。

1 int fun(int a);

标识符a的作用域就仅仅是fun后面的括号之间的范围。在程序的其他地方不能引入此标识符。在函数原型形参列表中起作用的的仅仅是形参类型,标识符并不起任何作用,因此可以省略,但是为了程序的可读性更高还是在参数类型后加上标识符。

2.局部作用域

 

1 void fun(int a)
2 {
3     int b = 0;
4     for(;b < a;)
5     {
6         int c;
7         c++;
8     }  
9 }

 

上述代码中a的作用域是第一行到最后一行,b的作用域为第三行到最后一行,而c的作用域则为第5行到第8行。

 1 #include<iostream>
 2 using namespace std;
 3 int a;
 4 int main()
 5 {
 6     a = 3;
 7     {
 8         int a;
 9         a = 7;
10         cout << a << endl;
11     }
12     cout << a << endl;
13     return 0;
14 }

上述代码运行结果先输出7后输出3。

那么为什么会出现两个不同的结果呢?

在第八行中我们又再次定义了一个整型变量a。第一次定义a时它是全局变量,我们先将其赋值为3,当我们第二次定义a之后在内层大括号中这个a不再是那个全局变量的a了。当我们第一次与第二次定义的变量的名字虽然相同,但是其地址不同,这是由于系统在分配内存时给局部变量和全局变量分配的地址不相同。所以虽然变量名称相同也不会造成重定义。随意在内层括号内全局变量被覆盖掉了,这也就是为什么第一次输出的是7,当程序跳出内层括号后,a还是全局变量,所以第二次输出的是3。这种情况的出现是极其不好的,所以我们在写程序时要避免出现这种情况。

3.类作用域

(1)在类X的成员函数中没有声明同名的局部作用域标识符,在该函数内可以直接访问类的成员m。

(2)通过x.m或X::m访问对象成员。

(3)通过ptr->m这样的指针表达式来访问m。