标识符的作用域 “作用域是一个标识符在程序正文中有效的区域”——来自教材《C++语言程序设计》 一、函数原型作用域 “在函数原型声明时形式参数的作用范围就是函数原型作用域
标识符的作用域
“作用域是一个标识符在程序正文中有效的区域”——来自教材《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; }
运行截图: