C++内部类
内部类基础定义
定义:在一个外部类的内部,完整定义另一个类,这个内嵌的类就叫内部类
核心权限特性:内部类可以直接访问外部类所有成员(包括 private 私有成员); 外部类不能直接访问内部类的私有成员,需要借助内部类对象访问
内部类与外部类的关系
逻辑从属:内部类是外部类的内部作用域,逻辑上属于外部类,但不存在继承关系
内存布局:外部类对象内存里不会自动包含内部类对象,二者是独立内存,只有手动创建内部类对象才会分配内存
访问权限区分:
✅ 内部类 → 可随意读取 / 修改外部类所有私有、保护、公有成员
❌ 外部类 → 不能直接访问内部类私有成员,必须创建内部类对象才能访问
二者互不继承,没有父子类关系
外部创建内部类对象语法
完整类型名:外部类名::内部类名
创建格式:Outer::Inner obj;
受访问修饰符限制:
○ 若内部类定义在 private 下:外部无法创建内部类对象
○ 若内部类定义在 public 下:全局 / 其他类可以创建内部类对象
内部类核心用途
1.隐藏实现细节,强化封装 仅外部类内部需要使用的工具类,定义为内部类,对外完全不可见,不会污染全局命名空间
2.专用配套模块:只服务于外部类的功能,不需要暴露给外部代码
3.缩小类的作用域,减少全局类数量
内部类声明与实现分离写法
如果内部类只在外部类内声明,函数实现写在外部,函数前必须加 外部类名::内部类名 限定作用域
完整代码示例
示例 1:基础内部类,内部类访问外部私有成员
#include <iostream>
using namespace std;
// 外部类
class Outer
{
// 外部类私有成员
private:
int outerNum = 100;
public:
// 公有的内部类,外部可以创建
class Inner
{
public:
void showOuterData(Outer& out)
{
// 内部类可以直接访问外部类私有成员
cout << "访问外部类私有变量:" << out.outerNum << endl;
}
};
// 外部类函数创建内部类对象
void testInner()
{
Inner in;
in.showOuterData(*this);
}
};
int main()
{
// 外部创建内部类对象:Outer::Inner
Outer::Inner innerObj;
Outer out;
innerObj.showOuterData(out);
out.testInner();
return 0;
}
运行结果:
访问外部类私有变量:100
访问外部类私有变量:100
示例 2:私有内部类(外部无法创建)
#include <iostream>
using namespace std;
class Outer
{
// 私有内部类,仅外部类内部可用
private:
class Inner
{
public:
void func()
{
cout << "私有内部类函数" << endl;
}
};
public:
void useInner()
{
Inner in;
in.func();
}
};
int main()
{
// Outer::Inner in; // 报错!Inner是Outer私有,外部无法访问
Outer out;
out.useInner();
return 0;
}
示例 3:内部类声明、实现分离写法
#include <iostream>
using namespace std;
class Outer
{
public:
// 仅声明内部类,实现写在类外
class Inner;
};
// 外部实现内部类的成员函数,必须加 Outer::Inner 限定
class Outer::Inner
{
public:
void print()
{
cout << "分离实现的内部类" << endl;
}
};
int main()
{
Outer::Inner in;
in.print();
return 0;
}
总结
1.内部类写在外部类作用域内,逻辑从属、内存独立、无继承关系
2.权限单向:内部类可访问外部类全部私有成员,外部类不能直接访问内部类私有
3.外部实例化格式:外部类::内部类 对象名,受 public/private 权限控制
4.核心作用:封装隐藏专用工具类,不对外暴露,精简全局命名
5.分离实现语法:外部写函数时,前缀 外部类::内部类
更多推荐
所有评论(0)