C++ 模板类demo

#include <iostream>
using namespace std;

template <typename T>
class MyVector
{

    friend ostream & operator<< <T>(ostream &out,  const MyVector &obj);
public:
    MyVector(int size = 0);  //构造函数
    MyVector(const MyVector &obj); // 拷贝构造函数
    ~MyVector(); //析构函数

public:

    T& operator[] (int index);//返回引用
    // a3 = a2 = a1;
    MyVector &operator=(const MyVector &obj);

    

public:
    int getLen()
    {
        return m_len;
    }

protected:
    T *m_space;
    int m_len;
};
#include <iostream>
using namespace std;
#include "MyVector.h"

template <typename T>
ostream & operator<<(ostream &out,  const MyVector<T> &obj)
{
    for (int i=0; i<obj.m_len; i++)
    {
        out << obj.m_space[i] << " ";
        //out << t1;
    }
    out << endl;
    return out;
}


//MyVector<int> myv1(10);
template <typename T>
MyVector<T>::MyVector(int size)  //构造函数
{
    m_space = new T[size];
    m_len = size;
}


//MyVector<int> myv2  = myv1;
template <typename T>
MyVector<T>::MyVector(const MyVector &obj) // 拷贝构造函数
{
    //根据myv1的大小分配内存
    m_len = obj.m_len;
    m_space = new T[m_len];

    //copy数据
    for (int i=0; i<m_len; i++)
    {
        m_space[i] = obj.m_space[i];
    }

}

template <typename T>
MyVector<T>::~MyVector() //析构函数
{
    if (m_space != NULL)
    {
        delete [] m_space;
        m_space = NULL;
        m_len = 0;
    }
}

template <typename T>
T& MyVector<T>::operator[] (int index)
{
    return m_space[index];
}


// a3 = a2 = a1;
template <typename T>
MyVector<T> &  MyVector<T>::operator=(const MyVector<T> &obj)
{
    //先把a2的旧的内存释放掉

    if (m_space != NULL)
    {
        delete[] m_space;
        m_space = NULL;
        m_len = 0;
    }

    //根据a1分配内存 
    m_len = obj.m_len;
    m_space = new T[m_len];

    //copy数据
    for (int i=0; i<m_len; i++)
    {
        m_space[i] = obj[i];
    }
    return *this;  // a2 = a1; 返回给a2 的自身
}
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

#include "MyVector.cpp"

//1  优化Teacher类, 属性变成 char *panme, 购置函数里面 分配内存
//2  优化Teacher类,析构函数 释放panme指向的内存空间
//3  优化Teacher类,避免浅拷贝 重载= 重写拷贝构造函数 
//4  优化Teacher类,在Teacher增加 << 
//5  在模板数组类中,存int char Teacher Teacher*(指针类型)

//=====>stl 容器的概念 


class Teacher
{
public:
    Teacher()
    {
        age = 33;
        strcpy(name, "");
    }

    Teacher(char *name, int age)
    {
        this->age = age;
        strcpy(this->name, name);
    }
    void printT()
    {
        cout << name << ", " << age << endl;
    }
private:
    int age;
    //char name[32];
    char *pName2;
};


void main()
{
    Teacher t1("t1", 31), t2("t2", 32), t3("t3", 33), t4("t4", 34);

    MyVector<Teacher> tArray(4);

    tArray[0] = t1;
    tArray[1] = t2;
    tArray[2] = t3;
    tArray[3] = t4;

    for (int i=0; i<4; i++)
    {
        Teacher tmp = tArray[i];
        tmp.printT();
    }
    cout << tArray;



    system("pause");
}
void main02()
{
    MyVector<char> myv1(10);
    myv1[0] = 'a';
    myv1[1] = 'b';
    myv1[2] = 'c';
    myv1[3] = 'd';

    cout << myv1;

    system("pause");
}

void main01()
{
    MyVector<int> myv1(10);

    for (int i=0; i<myv1.getLen(); i++)
    {
        myv1[i] = i+1;
        cout << myv1[i] << " ";
    }
    cout << endl;


    MyVector<int> myv2  = myv1;
    for (int i=0; i<myv2.getLen(); i++)
    {
        cout << myv2[i] << " ";
    }

    cout << myv2 << endl;
    
    cout<<"hello..."<<endl;
    system("pause");
    return ;
}
原文地址:https://www.cnblogs.com/yaowen/p/4777310.html