C++第三次作业--作用域
作用域
任何一种语言最基本的部分就是变量,而变量有两个非常重要的特性,作用域和生存期。
定义
作用域是变量的一个属性,某个变量在代码中有效的区域为该变量的作用域。
函数原型作用域
函数声明参数从参数声明开始到函数声明结束。此作用域为c++程序中最小的作用域,生存周期最短。
例:int func(int i) i为参数,作用域类型为函数原型类型。
const int n=10; int f(int n,int m = n); //error,n referrence to (int n) not (const int n)
函数作用域
函数的作用域相当于编译器划分给的函数的一段时间上与物理内存上的区域。在这段时间内,函数内定义的局部变量存在,过了这段时间,这个变量就不存在。同样,在这段内存中的变量是被该函数独享的,外部不能访问。
#include <iostream> using namespace std; int main () { // 局部变量声明 int a, b; int c; // 实际初始化 a = 10; b = 20; c = a + b; cout << c; return 0; }
结果:30
命名空间作用域
在源程序中,其实,全局作用域也是一个命名空间,全局命名空间中变量的作用域从声明开始,到编译单元中断,在连接的时候,又将多个编译单元的全局命名空间连接在一起。
命名空间的变量的作用域:
从声明开始,到该命名空间结束中断,在新的一段同名命名空间开始继续开始。在使用using的地方,将该部分加入到作用域中。命名空间的子命名空间也包含其中。匿名命名空间和inline命名空间变量的作用域包含其父亲命名空间。
namespace A { //Scope of A begins int a1=3; //Scope of a1 begins inline namespace B { //Scope of B begins int a2; //Scope of a2 begins } namespace C { //Scope of C begins int a3=3; //scope of a3 begins int f() { cout<<a1<<endl; } } //scope of a3 ends namespace { int a4; //scope of a4 begins } //int a2; //error: duplicate defination a2 } //scope of a1,a2,B,C,a4 interrupted
namespace A { //scope of a1,a2,B,C,a4 continue }
类作用域
类中的数据和函数分为公有类(public),保护类(protected),私有类(private),
类公有派生类,保护派生类,私有派生类
类中的成员 在public中 ,可以在其他地方直接使用 使用方法:对象.公用类成员(对象::公用类成员)
而其他的需要借助公有类函数调用 ,但是在类中可以直接调用 。
class中的变量的作用域为:
- 从声明开始,到class结束
- 所有的类中成员函数的函数体中,不管是在声明之前,或者是在class之外
- 函数的默认参数中
- 所有嵌套在函数中的成员
例:
class X { int f(int a = n) { // X::n is in scope inside default parameter return a*n; // X::n is in scope inside function body } int g(); int i = n*2; // X::n is in scope inside initializer // int x[n]; // Error: n is not in scope in class body static const int n = 1; int x[n]; // OK: n is now in scope in class body }; int X::g() { return n; } // X::n is in scope in out-of-class member function body
访问类中成员的方法有以下四种:
- 在class的作用域中,或子类的作用域中
- class或者子类的对象使用’.‘
- class或者子类对象的指针,使用'->'
- class 或者子类使用'::'
枚举作用域
枚举有两种类型: scoped enumeration and unscoped enumeration这两种类型的作用域是不同的。scoped enumeration: 作用域从变量声明开始,到enumeration结束为止。
unscoped enumeration: 作用域从变量声明开始,到enumeration结束,继续存在,直到全局作用域结束。
enum e1{ A, B }; enum class e2{ A2, B2 }; e1 o1 = B; //e2 o2 = B2; //error : B2 not in scope e2 o2 = e2::B2;