类似于java中的泛型
定义: temlpate<typename T> class complex{ public: complex(T r=0,T i=0):re(r),im(i){} complex& operator += (const complex& ); T real() const {return re;} T imag() const {return im;} private: T re,im; friend complex& __doapl(complex*,const complex&); } 使用 complex<double> c1(2.0,1.3); complex<int> c2(2,7);适配器: A 有一个成员数据B,使用B带有的成员数据和方法实现A中所有的成员函数和方法。即A是B的适配器。例如下例中queue适配了c
//queue中有一个dueque<int> 类型的成员数据c; class queue{ private: dueque<int> c; stone* p; public: bool empty() const {return c.empty();} size_type size() const {return c.size();} }组合占用内存大小: 分别计算每一个成员占用内存的大小并求和即得到组合占用的内存大小。如上例中c占用16个字节,那么queue占用内存大小为: 16 + 4 = 20 字节;
组合构造和析构函数的调用顺序:
构造: 由内向外构造,即先构造成员(默认使用默认的构造函数,如果要使用指定的构造函数,需要自己实现),后构造本身。先构造c,后构造queue析构: 由外向内析构,即先析构本身,后析构成员。先析构queue,后析构c组合和委托:
组合使用has a 即,成员和本身处于同一个生命周期,成员类似于by value 值委托使用指针,即成员和本身个字拥有自己的生命周期,成员类似于by reference 引用,如果将上例中stone* p 属于委托,c则属于组合。