标识符的作用域

标识符的作用域

“作用域是一个标识符在程序正文中有效的区域”——来自教材《C++语言程序设计》

一、函数原型作用域

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

函数的形参的标识符只在这个函数中有效,另外,函数中的声明的变量的标识符也只在该函数中生效。当在函数以外的地方使用这些标识符时(如果在这些地方没有声明过这些变量),编译器就会报错。

实验1:在函数内声明一些变量,在函数外使用,然后观察编译器的反应,以及如何解决。

在这里插入图片描述

要在这些地方使用相同的标识符时,就需要再次对这些标识符进行声明。

在这里插入图片描述

对主函数中标识符进行重新声明后,运行成功:
在这里插入图片描述

二、局部作用域(块作用域)

在块里面声明的变量,其作用域从声明处开始,一直到声明所在的块结束的大括号为止。

实验2:在块外面声明变量,然后再在块里面声明同样标识符的变量,并分别在块内和块外使用cout语句将变量的值输出到屏幕,查看结果,并尝试去查找原因。

#define _CRT_SECURE_NOWARNINGS
#include<iostream>
using namespace std;
int main()
{
 int flag=1;
 int i = 2;
 int j = 3;
 if (1)
 {
  int flag = 78;
  cout << "块内flag=" << flag << endl;
  if (1)
  {
   int i = 28;
   cout << "块内i="<<i << endl;
   if (1)
   {
    int j = 45;
    cout << "块内j=" << j << endl;
   }
   cout << "块外j=" << j << endl;
  }
  cout << "块外i=" << i << endl;
 }
 cout << "块外flag=" <<flag<<endl;
 system("pause");
 return 0;
}

运行截图:
在这里插入图片描述

实验表明,在块内声明的标识符的作用域是从该标识符的声明处开始,到块结束为止,如果有相同的标识符的作用域将该块包含在内,在块内使用的依旧是在块内的声明的标识符。

三、类作用域

“类可以被看成是一组有名成员的集合,类X的成员m具有类作用域,对m的访问方式有如下三种:

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

(2)通过表达式x.m或者x::m。这正是程序中访问对象成员的最基本方法。

(3)通过ptr->m这样的表达式,其中ptr为指向X类的一个对象的指针。”

实验3:写一个名为Circle的类,有成员R,一个计算面积的成员函数,一个构造函数。


#define _CRT_SECURE_NOWARNINGS
#include<iostream>
using namespace std;
#define Pi 3.14
class Circle {
public:
 Circle(float R)
 {
  radius = R;
 }
 double getArea()
 {
  return Pi * radius * radius;
 }
private:
 float radius;
};
int main()
{
 float R;
 cout << "请输入圆的半径" << endl;
 cin >> R;
 Circle MyCircle(R);
 cout << "该圆的面积为" << MyCircle.getArea() << endl;
 system("pause");
 return 0;
}

运行截图:
在这里插入图片描述

四、命名空间作用域

“一个命名空间确定了一个命名空间作用域,凡是在该命名空间之内声明的、不属于前面所述各个作用域的标识符,都属于该命名空间作用域。”

我们经常使用的cout、cin语句就是来自于命名空间std,我们在使用这些语句之前需要使用以下语句:

using namespace std;

实验4:将一个类的声明写在一个命名空间里,并将这个命名空间写在一个头文件中,并在主函数中对其中的标识符进行操作。

myspace.h

//myspace.h
#define Pi 3.14
namespace myspace
{
 class Circle {
 public:
  Circle(float R);
  double getArea();
 private:
  float radius;
 };
}

类的函数.cpp

//类的函数.cpp
#include"myspace.h"
using namespace myspace;
Circle::Circle(float R)
{
 radius = R;
}
double Circle::getArea()
{
 return radius * radius*Pi;
}

源.cpp

// 源.cpp
#define _CRT_SECURE_NOWARNINGS
#include<iostream>
#include"myspace.h"
using namespace std;
using namespace myspace;
int main()
{
 Circle circle(1);
 cout << "圆的面积为:" << circle.getArea()<<endl;;
 system("pause");
 return 0;
}

运行截图:
在这里插入图片描述

posted on 2019-09-27 14:09  Tlyh  阅读(775)  评论(0编辑  收藏  举报

导航