在 C++ 编程中,内部类(也称为嵌套类)是一个定义在另一个类作用域内的类。 内部类提供了一种封装和逻辑分组的方式,使得代码更加模块化和易于管理。 本文将详细介绍 C++ 中内部类的定义、使用场景、访问权限及其与外围类(外部类)的相互作用。
内部类是在一个类的成员部分定义的另一个类。
内部类是⼀个独立的类,跟定义在 全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。
简单来说内部类与外部类的关系就是:(划重点)
内部类是外部类的友元类,但外部类不是内部类的友元类,并且内部类受到外部类类域限制和访问限定符限制。
简单来说:内部类默认是外部类的友元类
<1>内部类可以定义在外部类的public、protected、private中都是可以的。
<2>内部类可以直接访问外部类中的static、枚举成员、不需要外部类的对象名。
<3>内部类访问外部类的普通成员,需要借助外部类对象(否则无法得知访问的是哪一个对象的)
例如:
#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
}
};
};
int A::k=3;
这里cout<<h<<endl;是一个非常常见的错误。因为内部类是一个独立的类,不属于外部类,所以此时还没有外部类的对象,显然也不存在h。
而k就不同了,静态成员不需要外部类的对象就已存在,所以这里k是OK的。
想要在内部类访问外部类的普通成员,就需要通过外部类对象的方式,比如下方代码,传递一个外部类对象作为参数就可以访问外部类成员
#include <iostream>
using namespace std;
class A
{
private: static int k;
int h;
public: class B {
void foo(const A& a )
{
cout << k << endl;//外部类的静态成员,内部类可以直接访问
cout<<a.h<<endl;//外部类的普通成员,内部类需要借助外部类对象访问
}
};
};
int A::k = 3;
内部类不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。
内部类在定义它的外围类的作用域内是可见的,但在外围类外部是不可见的。
#include<iostream>
using namespace std;
class A
{
private:
static int _k;
int _h = 1;
public:
class B // B默认就是A的友元
{
public:
void foo(const A& a)
{
cout << _k << endl; //OK
cout << a._h << endl; //OK
}
private:
static int a;
};
void fun()
{
//cout << B::a << endl;
//外部类无法访问内部类的私有成员
}
};
int A::_k = 1;
int main()
{
A::B b;//假如内部类受外部类公有限定符限制,可以这样创建内部类对象
A aa;
return 0;
}
C++ 中的内部类提供了一种灵活的方式来封装和隐藏实现细节,使得代码更加模块化和易于管理。 通过内部类,可以更好地控制访问权限,避免命名冲突,并实现辅助类来支持外围类的功能。 理解内部类的定义、访问权限及其与外围类的相互作用,对于编写高质量的 C++ 代码至关重要。