1、组合
前面一直都在用组合的方法创造类。
class Circle
{
private:
float radius;
public:
Circle(float r);
~Circle();
float circumference();
float area();
};
如上面所示程序,Circle类中,也包含这float类型的数据。我们已经习惯于将C++的基本类型数据类型作为类的组成部件。实际上类的成员数据既可以是基本类型也可以是自定义类型,当然也可以是类的对象。
类的组合描述的就是一个类内嵌套其他类的对象作为成员的情况。它们之间的关系是一种包含与被包含的关系。
1.1 类的组合的构造函数
想象一下,如果一个类的定义中不含类的对象,只有基本数据类型那么参数的初始化就比较简单。如果类的数据中包含了自定义数据类型或者对象,那么我们在创建这个类的时候既要对本类的基本数据类型进行初始化,又要对内嵌对象成员进行初始化。此时,构造函数的调用顺序就尤其重要。
组合类构造函数定义的一般顺序:
类型::类名(形参表):内前对象1(形参表),内嵌对象2(形参表),...
{类的初始化}
Circle::Circle(float r):radius(r) {}
- 调用内嵌对象的构造函数,调用顺序按照内嵌对象在组合类中的定义顺序,与组合类构造函数初始化列表没有关系。
- 执行本类构造函数的函数体。
- 析构函数的调用执行顺序与构造函数的刚好相反。
2、前向引用声明
C++中变量都是先定义,在使用。同样滴,C++中类也是这样的。
- 类应该先声明,后使用
- 如果需要在某个类的声明之前,引用该类,则应该进行前向引用声明。
- 前向引用声明只为程序引入一个表示符,具体声明在其它地方。
class B;//前向引用声明
class A{
public:
void f(B b);
};
class B{
public:
void g(A a);
};
注意:
- 在提供一个完整的类的声明之前,不能声明该类的对象,也不能在内联成员函数中使用类的对象。
- 当使用前向引用声明时,只能使用被声明的符号,而不能设计类的任何细节。
class Fred;//前向引用声明
class Barney{
Fred x; //错误:类Fred的声明尚不完善
};
class Fred{
Barney y;
};
3、结构体
结构是C++从C语言继承过来的。唯一的区别是,结构体和类的默认访问控制属性不同。类的缺省类型为private;结构体的缺省类型为public。
4、联合体
联合体的全部数据成员共享同一组内存单元。