-
嵌套类
-
定义
一个类可以定义在另一个类的内部,被称为嵌套类,定义嵌套类的类被称为外部类。嵌套类时一个独立的类,和外层类基本没什么关系,它是一个独立的类,它的成员不属于外部类,外围类的成员也不属于该嵌套类。 -
作用
之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。 -
作用域
1、如果嵌套类声明在一个类的私有部分,则只有嵌套类的外部类可以访问;
2、如果嵌套类声明在一个类的保护部分,则只有嵌套类的外部类和外部类的派生类可以访问;
3、如果嵌套类声明在一个类的公有部分,都可以访问但是必须加上外部类的外部类作用域限制符。 -
访问权限
1、嵌套类名与它的外部类的对象成员名具有相同的访问权限规则,外部类对象的访问权限只有public,所以嵌套类也是一样;
2、嵌套类中说明的成员不是外部类中对象的成员,嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此,它们都遵循普通类所具有的标号访问控制。
3、嵌套类可以直接引用外围类的静态成员、类型名和枚举成员(假定这些成员是公有的)。
4、嵌套类必须声明在类的内部,但是可以定义在类的内部或者外部。
5、在外层类之外定义一个嵌套类时,必须以外层类的名字限定嵌套类的名字。class Outer { public: class Inner { public: void Fun(); }; public: Inner obj_; void Fun() { cout<<"Outer::Fun...."<<endl; obj_.Fun(); } }; void Outer::Inner::Fun() { cout<<"Inner::Fun..."<<endl; } void Fun() { class LocalClass { public: int num_; void Init(int num) { num_=num; } void Display() { cout<<"num_"<<num_<<endl; } }; LocalClass lc; lc.Init(10); lc.Display(); } int main() { Outer o; o.Fun(); Outer::Inner i; i.Fun(); Fun(); return 0; } 结果: Outer::Fun.... Inner::Fun... Inner::Fun... num_10
-
-
局部类
类可以定义在某个函数的内部,这样的类被称为局部类,局部类定义的类型只在定义它的作用域内可见。
局部类不能使用函数作用域中的变量。
局部类已经封装在函数作用域中,通过信息隐藏进一步封装就显得没什么必要了。
可以在局部类的内部再嵌套一个类,此时,嵌套类的定义可以出现在局部类之外且与局部类相同的作用域中。