C++ 中的嵌套类和局部类

C++ 中的嵌套类和局部类

 

最近趁着春节假期空闲,找了本C++ Primer 学了几章,发现C++ 中的许多特性自己都不知道。其中嵌套类和局部类感觉还是蛮有用的,简单的写写他们的用法。

嵌套类

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

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

下面就是一个类似的例子:

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;
}

技术分享

局部类

所谓局部类,就是定义在一个函数内部的类,这个类只能在这个函数内部使用。下面是个例子:

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 了。

 

另外,多说一句,函数是不能嵌套的。比如下面的例子是无法编译通过的。

int main()
{
    void foo() { cout << "WRONG";};

    foo();
}

但是我们可以通过一些变通的方法来模拟出一个局部函数来。具体来说就是通过重载一个类的operator () 方法来模拟一个函数调用,下面给个例子:

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

    foo();
    cout << foo(1, 2);
}

技术分享


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。