内部类与类作为成员属性
前言
内部类与内部类成员属性是两个不同的概念,如果对这两个名词表达的意思模棱两可,可能会对读代码造成影响,本文聚焦于这两者为大家区分清楚这两个不同的概念。
内部类是,一般指将A类定义在B类的内部,也就是我们常说的嵌套类。类可以嵌套一层也可以嵌套多层,根据实际需求来选择是否嵌套。
类作为成员属性,指的是利用A类在B类的内部实例化对象,该对象作为B内部的成员属性,不属于嵌套类。
内部类
内部类的特点:
1.内部类是定义在类域内的独立的类,内部类可以和全局域中的类同名,但调用时要指明作用域。
2.内部类默认是外部类的友元类。(友元是一个比较重要的语法,在类与对象下会讲到)
3.内部类本质是一种封装,内部类被定义在外部类域内,使用内部类时都需要指明类域。
如图所示,在Person类域中定义了一个Man类,Man类就是Person的内部类,Person类就是外部类。其中,内部类默认是外部类的友元类,换句话说,外部类(Person)拿内部类(Man)当知心朋友,能告诉朋友一切秘密......值得注意的是,友元权限是单向的,也就是你拿别人当朋友别人不一定拿你当朋友,如果两者都有友元声明就叫相互友元。因此,如图所示外部类无法访问内部类的私人属性。
类作为成员属性
在一个类中利用另一个类来实例化对象,这种情况类似于复合函数,当调用这个类来实例化对象时未免会调用到类内对象的构造,下面主要探讨的是像这种类作为成员属性的情况,构造和析构的顺序是怎样的。
如图,当直接创建p1对象时,会调用Person的构造函数来为p1初始化,而p1中的变量又包含有Man这个类的对象,在创建m_man时也涉及到该对象的初始化,二者调用构造的顺序是怎样的呢?
由图不难看出,编译器先调用Man类的构造函数再调用Person的构造函数,换句话说就是先打地基再造楼。而析构的顺序恰好与构造的相反,这是因为如果属性中存在在堆区开辟的空间时,先将类内的m_man释放掉能防止内存泄漏的风险。
一般情况下,像这种复合类的情况都是先入后出的形式,即构造时先调用其它类的对象,在构造自身,析构与构造相反。
以上是本文的主要内容了,主要还是区分好内部类与类作为成员属性的区别就行。