c++ 内部类
一、基本概念
- 定义方式:在外部类内部定义的独立类,语法上属于外部类成员
- 独立性:
- 内部类与外部类无继承关系,不能通过外部类对象直接访问内部类成员
- 内部类对象必须通过外部类作用域限定符创建(如
Outer::Inner obj
)
二、访问控制特性
- 单向友元关系:
- 内部类自动成为外部类的友元,可访问外部类所有成员(包括private)
- 外部类不具备对内部类的特殊访问权限
- 作用域嵌套:
- 内部类可直接访问外部类的static成员和枚举类
- 访问非static成员需通过外部类对象参数传递
class Outer {static int s_data;int m_data;class Inner {void foo(Outer& o) { cout << s_data; // 直接访问static成员cout << o.m_data; // 通过对象访问非static成员}}; };
三、应用场景
- 实现封装:
- 将仅被外部类使用的辅助类隐藏为private内部类
- 示例:迭代器模式中,将Iterator作为容器的内部类
- 代码组织:
- 减少全局命名空间污染,逻辑相关的类集中管理
- 特殊设计:
- 通过private内部类实现"禁止继承"的类(如
final
效果)
- 通过private内部类实现"禁止继承"的类(如
四、注意事项
- 内存关系:
sizeof(外部类)
不包含内部类大小,二者内存布局独立
- 定义位置:
- 可在外部类外定义内部类成员函数,需用双重作用域限定符
void Outer::Inner::func() { /*...*/ }
- 模板应用:
- 内部类可配合模板实现元编程辅助类
五、与友元类的区别
特性 | 内部类 | 友元类 |
---|---|---|
访问权限 | 自动获得外部类所有成员访问权 | 需显式声明friend |
语法关系 | 嵌套定义 | 独立定义 |
典型用途 | 逻辑强关联的实现类 | 跨类协作的特殊场景 |
内部类通过语法嵌套和自动友元特性,在保持封装性的同时提供了更灵活的代码组织方式。实际开发中建议优先用于强关联的辅助类实现,避免过度使用导致结构复杂化