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

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

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

#include <iostream>
using namespace std;
class c1
public:
    int a;
    void foo();
    class c2
    public:
        int a;
        void foo();
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;}
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);
                                    1. 嵌套外围需要使用嵌套对象作为底层实现,并且该嵌套只用于外围的实现,且同时可以对用户隐藏该底层实现。从作用域的角度看,嵌套被隐藏在外围,该名只能在外围使用。如果在外围之外的作用域使用该名时,需要加名字限定。
嵌套的成员函数可以在它的体外定义。
嵌套的成员函数对外围的私有成员没有访问权,反之亦然。
嵌套仅仅只是语法上的嵌入。
2. 局部也可以定义在函数体内,这样的被称为局部(loacl class)。局部只在定义它的局部域内可见。
局部的成员函数必须被定义在局部不能有静态成员函数。
在实践局部很少使用。
下面给出一段代码
                                    嵌套就是:在一个的作用域里,又定义了一个。
1、为什么引入嵌套?
之所以引入这样一个嵌套,往往是因为外围需要使用嵌套对象作为底层实现,并且该嵌套只用于外层的实现,同时可以对用户隐藏该底层实现。
可以这样理解:有一些工作不想被用户知道怎么实现的,那么就把这些工作交给嵌套实现,然后对外层提供一个接口即可。
class A 
private:
    class Imp;
    Imp* impl;
public:
    virtual ~A();
                                    1. 嵌套(nested class)
一个可以定义在另一个的内部,前者称为嵌套嵌套时一个独立的,和外层基本没什么关系,它通过提供新的作用域来避免名称混乱.
	嵌套必须声明在的内部,但是可以定义在的内部或者外部。在外层之外定义一个嵌套时,必须以外层的名字限定嵌套的名字。
	嵌套的名字只在外围可见。
	的私有成员只有的成员和友元可以访问,因此外围不...
                                    嵌套介绍二级目录三级目录
在c++,可以将的声明放在另一个。在另一个声明的被称为嵌套,它通过提供新的作用域来避免混乱。包含的成员函数可以创建和使用被嵌套的对象;而仅当声明位于公有部分,才能在包含的外面使用嵌套,而且必须使用作用域解析运算符。
对进行嵌套与包含并不不同。包含意味着将对象作为另一个的成员,而对进行嵌套不创建成员,而是定义了一种型,该型仅在包含嵌套声明的有效。
对进行嵌套通常是为了帮助实现另一个,并避免名称冲突。Queue示例嵌套了结
                                    相比,基本上没什么区别,除了一点:就是嵌套的名称会被隐藏在外围的内部,也就是说嵌套的名称不是全局可见的,只能在外围内部可见,因此也不会与其他相同名字的产生冲突。另外,事实上嵌套的成员只能被外围访问(因为在外围之外是不可见的),所以嵌套通常所有的成员都被定义为public型,因为只有外围才能访问他们(对于非静态成员)。外围不能访问嵌套的非public成员,嵌套也不能访问外围的非public成员,嵌套于外围彼此独立,没有什么实际的关系。通常A被称作为外围,B被称作为嵌套。
                                    文章目录前言一、的大小跟static的关系二、多态和虚函数底层原理分析1.原理:2.C++多态可以划分为两大3.代码实例三、内部----》嵌套四、纯虚函数和抽象1.纯虚函数2.抽象3.代码实例总结
C++精准知识讲解
提示:以下是本篇文章正文内容,下面案例可供参考
一、的大小跟static的关系
更新的大小:的大小由所有非静态成员属性的大小决定(静态成员属性不占用的大小,因为静态成员属性存放在数据段)
代码实例:
#include <iostream>..
                                    函数的嵌套调用
C++不允许对函数作嵌套定义,也就是说在一个函数不能完整地包含另一个函数。在一个程序每一个函数的定义都是互相平行和独立的。虽然C++不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程,又调用另一个函数
所谓嵌套调用,是在调用一个函数并执行该函数的过程,又调用另一个函数的情况。如在main()函数调用了a函数,而在a函数的执行过程又调用b函数。这就构成...
	嵌套是一个独立的:
		外层的对象和嵌套的对象是相互独立的;
			嵌套的对象不包含任何外层定义的成员,外层的对象不包含任何嵌套定义的成员;
		嵌套的名字在外层作用域是可见的,在外层作用域之外不可见
		嵌套成员的种与非嵌套是一样的,...
嵌套分为两种:静态嵌套和内部。内部又有两种特殊的内部局部和匿名。如果局部只使用一次,则使用匿名更简洁。如果实现的接口只有一个方法,则lambda表达式更简洁。...