10C++复习.前向声明/嵌套类/局部类(内部类)
一、前向声明
在C++中,类需要先定义,而后才能被实例化,但是实际存在一种场景是:两个类需要相互引用或相互成为类中的子对象成员时,就无法先定义使用,在编译环节就出现错误导致编译失败,这时就需要用到前向声明,此外,前向声明的类不能被实例化。
【示例】
#ifndef _A_H
#define _A_H
#include "B.h"
class A
{
public:
A(void);
~A(void);
B b_; //A类中包含B类对象
};
#endif
#ifndef _B_H
#define _B_H
/*B类包含A类对象,A类又包含B类对象时,头文件也互相包含,这是不允许的,需要前向声明:
在B.h中将A类前向声明,此时就不再需要包含A.h头文件,且B中不能有A类的对象,因为前向声
明的类不能被实例化,但是可以是A类的指针或者引用*/
//#include "A.h"
class A; //类A的前向声明
class B
{
public:
B(void);
~B(void);
//A a_; //前向声明后,B类中不能含有A的对象
A *a_; //可以是指针
void Fun(A &a ) //可以是引用
{
}
};
#endif
二、嵌套类
顾名思义,嵌套类就是在类体中再定义另外一个类,形成类中类的情况。我们将最外层定义的类称为外围类,外围类内部再定义的类称为嵌套类。嵌套类的主要作用是为外围类提供服务的,外围类可以使用嵌套类对象作为外围类的底层实现,同时可以对用户隐藏该底层的实现。
嵌套类需要注意的几点:
(1) 作用域上,嵌套类是定义在外围类内部的,所以该类名只能在外围类内部使用,如果在外围类外部使用该类名时,需要加名字限定,如Out::Inner i;
(2) 嵌套类中的成员函数可以在它的外部定义。
(3) 嵌套类的成员函数对外围类的数据成员没有访问权,反之亦然。因为嵌套类仅仅是语法上的嵌入,它与外围类实际上是平级的。
下面是嵌套类的简单例子:
{
public:
class Inner //嵌套类
{
public:
void Fun() //也可以定义在外部
//{
//cout << "Inner::Fun()"<<endl;
//}
};
public:
Inner obj_;
void Fun()
{
cout << "Outer::Fun() "<<endl;
obj_.fun(); //嵌套类为外围类提供服务,对用户隐藏。
}
};
//Inner::Fun() //Error, 注意作用域。Inner对外部不可见
void Outer::Inner::Fun()
{
cout << "Inner::Fun() << endl;
}
int main()
{
Outer o;
//注意作用域,可以像使用其它类一样使用嵌套类,它仅仅是语法上的嵌入.
Outer::Inner i;
o.Fun();
i.Fun();
return 0;
}
三、局部类
局部类是指在函数内部定义的类,这样的类称为局部类local class,也称内部类。局部类只在定义它的局部域内是可见的。此外,局部类的成员函数必须定义在类体中,并且不能有静态成员。
下面内部类的示例:
{
//局部类,只在函数内部有效
class LocalClass
{
public:
int a_;
void Init(int &a ) //只能在类体中定义.
{
a_ = a;
}
//static int b_; //Error,局部类不能定义static静态数据成员.
};
LocalClass lc;
lc.Init(10);
}
int main()
{
Fun();
LocalClass lc; //Error, 局部类在函数外部不可用。
}
转自https://blog.csdn.net/sinat_33924041/article/details/83621287
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具