标识符的作用域
标识符的作用域
“作用域是一个标识符在程序正文中有效的区域”——来自教材《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;
}
运行截图: