// 第二十三模板 7复杂类模板
/*#include <iostream>
using namespace std;
const int size=10;
class people
{
public:
people(int i):x(i){};
people():x(0){}
int GetAge()const{ return x;}
void show()const{cout<<x<<endl;}
private:
int x;
};
template <class T>
class num
{
public:
num(int Tsize=size); //带一个整型的构造函数
num(const num&r); //应该是个复制构造函数
~num(){delete []pt;} //析构函数
num&operator=(const num&); //重载=运算符
T&operator[](int offset){ return pt[offset]; }
const T&operator[](int offset)const
{
return pt[offset];
}
int GetSize()const{return numsize; }
private:
int numsize;
T *pt;
};
template<class T>
num<T>::num(int size):numsize(size)
{
pt = new T[size];
for(int i=0; i<size; i++){
pt[i] = 0;
}
}
template <class T>
num<T>::num(const num&r)
{
numsize = r.GetSize();
pt = new T[numsize];
for(int i=0; i<numsize; i++){
pt[i] = r[i];
}
}
template<class T>
num<T>&num<T>::operator=(const num&r)
{
if(this == &r){
return *this;
delete []pt;
numsize = r.GetSize();
pt = new T[numsize];
for(int i=0; i<numsize; i++){
pt[i] = r[i];
}
}
return *this;
}
int main()
{
num<int>one;
num<people>two;
people *p;
for(int i=0; i<one.GetSize(); i++)
{
one[i] = i*2;
p = new people(i*3);
two[i] = *p;
delete p;
}
for(int j=0; j<one.GetSize(); j++){
cout<<"one["<<j<<"]:"<<"\t"<<one[j]<<"\t\t";
cout<<"two["<<j<<"]:"<<"\t";
two[j].show();
cout<<endl;
}
//num类中定义的复制构造函数和operator=()函数都没有被使用
//当我们在创建一个num灰对像并用一个已经存在的num类对像对其进行初始化时会调用复制构造函数
num<people>three = two;
for(int jj=0; jj<three.GetSize(); jj++){
cout<<"three["<<jj<<"]:"<<"\t";
three[jj].show();
cout<<endl;
}
//最后要注意模板成员函数的定义方法
//声明中写内嵌函数
//T&operator[](int offset){ return pt[offset]; }
//在类的外部写成员函数,必须这么写
//T& num<T>::operator[](int offset)
//{
// retrun pt[offset];
//}
//T为返回类型,num<T>o为模板类名称,之后面加作用域解析符::,表示后面的operator[]()函数是属于该模板类的
return 0;
}*/