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

 

posted on   Hello-World3  阅读(4283)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示