嵌套类与局部类

嵌套类

所谓嵌套类就是可以在一个类中定义另一个类。这个被嵌套的类的作用域就只在它的上一级类中。下面是个例子:

[cpp] view plain copy 
#include <iostream>  
using namespace std;  
 
class c1  
{  
public:  
   int a;  
    void foo();  
    class c2  
    {  
   public:  
       int a;  
    void foo();  
  } b;  

};  

void c1::foo()  

{  
  a = 1;  
}  
void c1::c2::foo()  
{  
   a = 2;  
}  
  
int main()  
{  
  
    class c1 f;  
    f.foo();  
    f.b.foo();  
    cout << f.a << endl;  
    cout << f.b.a << endl;  
   return 0;  
}  




其实在C语言中也有类似的用法,在一个结构体中嵌套另一个结构体,或者在一个结构体中嵌套一个union 。我们还知道,C 语言中被嵌套的结构体或union 通常是匿名的。在C++中也是可以的,我们可以在一个类中嵌套另外一个匿名类。不过,匿名类的成员函数只能在类的声明中同时定义,因为这个类没有名称,我们没法在外部指代它。


下面就是一个类似的例子:
[cpp] view plain copy 
class c3  
{  
public:  
    int a;  
  void foo() {a = 3;}  

   class  

   {  

    public:  
        int a;  
       void foo() {a = 4;}  
   } b;  
};  

int main()  
{  
 
   class c3 ff;  
    ff.foo();  
   ff.b.foo();  
    cout << ff.a << endl;  
    cout << ff.b.a << endl;  
   return 0;  
}  
局部类
所谓局部类,就是定义在一个函数内部的类,这个类只能在这个函数内部使用。下面是个例子:
[cpp] view plain copy 
int main()  
{  
   class c4  
   {  
   public:  
       int a;  
       void foo() {a = 4;}  
   };  
 
   class c4 ff;  
   ff.foo();  
   cout << ff.a << endl;  
   return 0;  
}  
通常,嵌套类和局部类的所有成员变量我们都会声明为共有的。因为这两种类只在很小的范围内使用,没有必要通过定义接口来隐藏内部的信息。所以,可以把 class 改换成 struct,这样就可以不写public 了。
另外,多说一句,函数是不能嵌套的。比如下面的例子是无法编译通过的。
[cpp] view plain copy 
int main()  
{  
   void foo() { cout << "WRONG";};  
 
    foo();  
}  
但是我们可以通过一些变通的方法来模拟出一个局部函数来。具体来说就是通过重载一个类的operator () 方法来模拟一个函数调用,下面给个例子:

[cpp] view plain copy 

int main()  

{  
    struct  
   {  
       void operator () ( void )  
       {  
           cout << "HELLO" << endl;  
       }  
       int operator() (int a, int b)  
       {  
          return a + b;  
      }  
   } foo;  
  
    foo();  
    cout << foo(1, 2);  
}  






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值