A.类的组合
-
定义:类的组合就是以另一个的对象为数据成员
-
注意:要优先使用组合而不是继承;组合表达式的含义一部分的关系
-
类的组合案例分析:
1.类组合包含的类的对象,必须采用初始化参数列表方式调用各自类当中的构造函数去初始化
2.要通过包含的类的构造函数决定组合类的构造函数怎么写
3.组合中初始化参数列表的写法 :
B.初始化参数列表
注意:初始化参数列表是构造函数的另一种写法
应用场景:
-
形参名和数据成员相同,避免二义性问题
-
类和组合 必须要初始化参数列表的方式写构造
-
常数据成员必须采用初始化参数列表的方式
-
继承中子类的构造函数也必须初始化参数列表的方式
-
具体代码:
注意:
-
组合类必须要调用包含对象所属类的构造函数
-
形式上看不到包含对象所属类构造函数调用,必须准备无参的构造函数
C.组合中构造和析构顺序问题
-
一般构造顺序和析构是相反
-
类的组合中,优先构造包含对象,在构造自身对象
-
类的组合中,包含对象的构造顺序只和定义顺序有关,和初始化参数列表无关
-
举例:
D.类中类
定义:类中类就是一个类定义在另一个类当中
-
掌握访问类中类中即可
-
掌握类中的函数在类实现的写法
#include <iostream>
using namespace std;
struct Node
{
int data;
Node* next;
Node() :next(nullptr) {}
Node(int data) :data(data), next(nullptr) {}
Node(int data, Node* next) :data(data), next(next) {}
};
class List
{
public:
List();
void insertData(int data);
void printList()
{
Node* pmove = headNode->next;
while (pmove != nullptr)
{
cout << pmove->data << " ";
pmove = pmove->next;
}
cout << endl;
}
Node* begin()
{
return headNode;
}
private:
Node* headNode;
public:
//类中类
class Iterator
{
public:
Iterator(Node* pmove=nullptr);
private:
Node* pmove;
};
};
List::List()
{
headNode = new Node;
}
void List::insertData(int data)
{
headNode->next = new Node(data, headNode->next);
}
//类中类的访问剥洋葱
List::Iterator::Iterator(Node* pmove):pmove(pmove)
{
}
int main()
{
List list;
List::Iterator it=list.begin();
list.insertData(1);
list.insertData(2);
list.insertData(3);
list.printList();
return 0;
}