Skip to main content
 首页 » 编程设计

C++中的内部类

2022年07月19日137jillzhang

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

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

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

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

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

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

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

总结:

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


本文参考链接:https://www.cnblogs.com/hellokitty2/p/10771291.html