类的作用域
类的作用域是指类的成员的定义范围,就是说一个类的所有成员都在一个范围之内。 一个类好比就是悟空画的一个圈,这个类的成员函数和数据成员都在这个圈内,这个圈就是类的作用域。 这种思想就是要把一个类的数据结构封装起来,使得除类的成员函数之外的其他函数访问类的数据成员 时有一定的限制。看如下例子:
class A{
public:
void func1();
void func2();
private:
int x;
};
void A::func1(){
x=8;
}
void A::func2(){
int x;
x=7; //这里的x并非是类A的数据成员x
}
类A的数据成员x的作用域是整个类的定义范围,但是成员函数中定义了同名的局部变量后,就把类A的数据成员x隐藏起来了。
局部类
这里介绍一个特殊的类:在一个函数体内定义的类叫做局部类。要注意:局部类中不能声明静态成员函数,所有成员函数都必须定义在类体内。局部类只能通过他的外围作用域中的对象和函数进行联系。
嵌套类
还有一种特殊的类:在另一个类中定义的类叫做嵌套类,另一个类称为外围类。嵌套类是外围类的一个成员,所以就有public、private、protected三种权限。嵌套类中的数据成员的名字,如果与外围类中数据成员的名字相同,互不影响。
局部类和嵌套类举例如下:
#include <iostream>
using namespace std;
//局部类
void funcj()
{
int m=6;
class M{
public:
void Setm(int x){m=x;}
void printm(){cout<<"m= "<<m<<endl;}
private:
int m;
};
M mObj;
mObj.Setm(8);
mObj.printm();
cout<<"m= "<<m<<endl;
}
//嵌套类
class L
{
public:
class N{
public:
N(int x,int y){a=x;b=y;}
void Print(){cout<<"a= "<<a<<" b= "<<b<<endl;}
private:
int a,b;
};
L(int x){a=x;}
void Print(){cout<<"a= "<<a<<endl;}
private:
int a;
};
void main()
{
funcj();
L l1(5);
L::N n1(7,8);
l1.Print();
n1.Print();
}
第4到18行定义了函数funcj,其中第7到13行定义了局部类M,第14行声明类M的对象mObj,第15和16行调用成员函数。主函数中第37行调用函数funcj。注意如果在main函数中试图定义类M的对象,将会报错。类M的作用域在函数funcj范围内。注意输出结果为:
m= 8
m= 6
第20到34行定义类L,第23到29行定义嵌套类N。类M和类N有同名的成员函数Print和同名的数据成员a,两种互不影响。注意主函数中可以直接创建类N的对象,这与局部类不同,声明方式在类N前面加M::,输出如下:
a= 5
a= 7 b= 8