zoukankan      html  css  js  c++  java
  • 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.内部类相对于普通类来说,主要是能直接访问外部类的私有成员。

  • 相关阅读:
    如何上传整个项目或者是文件夹到github
    阅读笔记16-架构师推荐:提高90%开发效率的工具推荐
    阅读笔记15-这些普通的程序猿,如今都已进阶成为技术大佬
    python爬虫——爬取淘票票正在热映电影
    阅读笔记12-Java 面试题 —— 老田的蚂蚁金服面试经历
    SOA架构设计案例分析
    阅读笔记11-孤独后厂村:30万互联网人跳不出的中国硅谷
    阅读笔记09-Java程序员必备的Intellij插件
    阅读笔记08-程序员依然是这个时代,贫寒学子翻身的不二选择
    os.path.join()
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10771291.html
Copyright © 2011-2022 走看看