• C++中的内部类


    1.内部类的概念

    如果一个类定义在另一个类的内部,这个内部类就叫做内部类。注意此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。

    也就是说:内部类相当于外部类的友元类。注意友元类的定义,内部类中的方法可以通过外部类的对象参数来访问外部类中的所有成员(包括private)。但是外部类不是内部类的友元。

    2.内部类可以定义在外部类的public、protected、private都是可以的。

    如果内部类定义在public,则可通过 外部类名::内部类名 来定义内部类的对象。
    如果定义在private,则外部不可定义内部类的对象,这可实现“实现一个不能被继承的类”问题。

    #include <iostream>
    using namespace std;
    class A {
        private: 
            static int i;
            class B {}; // 这里B是private的,在A类外就不能使用A::B来定义内部类的对象。
    };
    int main(int argc, char* argv[])
    {
       A::B *b = new A::B();
       return 0;
    }
    View Code

    3.内部类可以直接访问外部类中的任何权限的static成员、枚举成员,不需要通过外部类的对象或类名来访问。

    #include <iostream>
    using namespace std;
    class A
    {
    private: 
        static int k;
        int h;
    
    public: 
        class B{
            void foo(){
                cout << k <<endl; //ok
                //cout << h << endl; //error,只有外部类对象存在时h才是存在的。 若foo的参数是A a,则可通过a.h访问
            }
        };
    };
    int A::k=3;
    
    int main() {
        return 0;
    }
    View Code

    这和友元类的使用也是同样的道理。“想要使用另一个类的非static成员,必须要存在这个类的对象”。

    4.在堆中创建内部类对象

    class A {
        public:
            class B{};
    };
    
    int main(int argc, char* argv[])
    {
           A::B *b = new A::B();
           return 0;
    }
    View Code

    5.内部类可以现在外部类中声明,然后在外部类外定义

    #include <iostream>
    using namespace std;
    class A {
        private: 
            static int i;
        public: 
            class B; //只是声明
    };
    class A::B { //定义A的内部类B
        public:
            void foo() {
                cout << i << endl;
            }
    };
    int main(int argc, char* argv[])
    {
           A::B *b = new A::B();
           return 0;
    }
    View Code

    6.sizeof(外部类)=仅仅是外部类的大小,和内部类没有任何关系。内部类的大小也和外部类没有关系

    #include <iostream>
    using namespace std;
    class A {
        int a;
    public:
        class B {
            int b;
            int c;
        };
    };
    int main(int argc, char* argv[])
    {
           cout << sizeof(A) << endl; //4
           cout << sizeof(A::B) << endl; //8
    
           return 0;
    }
    View Code

    总结:

    1.内部类相对于普通类来说,主要是能直接访问外部类的私有成员。

  • 相关阅读:
    svn使用教程
    事务的隔离级别--全网最详细
    idea的java类图标C不见,取而代之是J标识,且写代码无提示
    text .global_start 和_start
    transformClassesWithDexForDebug
    RxJava基本流程和lift源码分析
    Rxlifecycle(三):坑
    Rxlifecycle(二):源码解析
    RxJava操作符之Share, Publish, Refcount
    Rxlifecycle(一):使用
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10771291.html
Copyright © 2020-2023  润新知