composition
1.composition 复合,可以表示has-a。一个class中有一个另外一种东西。这个class与另外一个东西就叫做复合。
复合关系尽量用图来表示会更加明白。
template<class T>
class queue
{
...
protected:
deque<T> c;
public:
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
reference front() {return c.front(); }
reference back() { return c.back(); }
void push(const value_type& x) { c.push_back(x); }
void pop() { c.pop_front(); }
};
可以看到queue中含有deque。queue是一个单向队列,先进先出。而deque是双向队列,两段都可以进出。
可以看的出deque的功能会更加强大,通过对deque的改装,来实现queue。
从代码中可以看到,queue中没有多做事情,deque中的pop_front()变成了pop()。
从复合可以得到一个设计模式:Adapter 改造。
这只是一个特别的例子。
2.从内存的角度看Composition:
以一个例子来看:
(1)queue代码:
template <class T>
class queue
{
protected:
deque<T> c;
...
};
( 2 )deque代码:
template <class T>
class deque
{
protected:
Itr<t> start;
Itr<t> finish;
T** map;
unsigned int map_size;
};
(3)Itr代码:
template <class T>
struct Itr
{
T* cur;
T* first;
T* last;
T** node;
...
};
可以看出,queue复合deque,deque复合Itr。
从Itr中有四个指针,占有16个指针。
deque中有两个Itr与一个指针和一个无符号int,就是16*2+4+4=40.
queue中只有一个deque,那就是40.。
3.Composition关系下的ctor与dtor:
(1)构造函数的关系:
毋庸置疑,构造肯定需要从内到外的构造,只有构造好拥有的东西,才能再取构造自己。
所以,要先调用Component中的default的构造函数,再执行自己。
container::Container(.....):Component(){.......}; 黑体的东西是由编译器来做的的。
(2)析构函数的关系:
恰好相反,析构函数首先执行自己,然后再调用Component的析构函数。
Container::~Container(...){....~Component() };
要知道这些都是编译器自己安排好的,这些次序编译器都会帮助假如这些代码,无需自己写出来。
(3)第一点中间提到default构造函数,Component中可能会有很多析构函数,但是编译器只会帮助你调用
default构造函数,如果你需要指明调用哪个构造函数则需要你自己去写。
相关阅读
一、引言 最近把牛客网上华为在线机试训练题刷了一遍。还是比较有用的,貌似都来自华为内部OJ题库,已经顺利入职。现在分享一下我的
msconfig.exe禁用自启动项 msconfig.exe禁用自启动项的时候,都是先删除注册表自启动目录下的相应的项,比如TIM,在msconfig禁用了之
一、定义 字符数组:存储字符的数组 字符串 :是使用最频繁的字符数组,是一个特殊的字符数组 C++中并没有专门的字符串的类型,一个字
我想不会有什么帮助的索引 队列我有写过一篇题解来说明,见:【C++广度搜索入门】面积 这是我的第二篇广搜题解,可能仍有众多不足,请大
在讨论全局变量之前我们先要明白几个基本的概念:原文章地址:https://www.cnblogs.com/wanghetao/p/4492582.html1. 编译单元(模块)