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 ;
}
时间: 2024-10-23 03:17:37

C++ 模板类demo的相关文章

第六周项目6-复数模板类

阅读教材例10.1.该例实现了一个复数类,但是美中不足的是,复数类的实部和虚部都固定只能是double型的.可以通过模板类的技术手段,设计Complex,使实部和虚部的类型为定义对象时指定的实际类型. (1)要求类成员函数在类外定义. (2)在此基础上,再实现减法.乘法和除法 你可以使用的main()函数如下. int main( ) { Complex<int> c1(3,4),c2(5,-10),c3; //实部和虚部是int型 c3=c1.complex_add(c2); cout<

C++_智能指针模板类

智能指针是行为类似于指针的类对象,但这种对象还有其他功能. 本节介绍三个可帮助管理动态内存分配的智能指针模板(auto_ptr.unique_ptr和shared_ptr). void remodel(std:string & str) { std::string * ps = new std::string(str); ... str = ps; return; } 这段代码有缺陷,每当调用时,该函数都分配堆中的内存,但从不回收,从而导致内存泄漏: 但是有解决之道——在return语句前添加下

模板类的友元重载

模板类的友元重载和普通类的友元重载有不同之处,可以参考这篇CSDN博客http://blog.csdn.net/ozwarld/article/details/7770808 #include <iostream> using namespace std; template <class T> class Test; // 模板类前置声明 template<class T> ostream& operator << (ostream& out

C++ 模板函数与模板类

一.模板函数 函数模板提供了一类函数的抽象,即代表了一类函数.当函数模板被实例化后,它会生成具体的模板函数.例如下面便是一个函数模板: 当实际调用它时,就会生成具体的模板函数:    模板函数在调用过程中会进行数据类型的自动匹配(在不产生歧义的情况下),但如果需要指定类型的话,可以显示声明,如: 这样,函数模板中的T就会被double所代替. 自动匹配有以下的规则: 1) 函数实参是否满足模板的实参(此时的判断没有数据类型的转换): 2) 若不满足1), 函数实参进行数据转换在进行匹配: 3)

一个数组类【模板类】

这学期的大作业感觉挺简单的,就是写一个模板类MyList,实现一些Python中的list的操作(类似于c++中的vector,但是不支持迭代器).这些功能都很简单,唯一麻烦的就是模板类特别烦,特别是友元函数,首先要声明这个类,然后声明是函数的声明,然后是类中友元函数的声明,最后是实现.友元函数的声明还有一个问题就是声明时在函数名后面要加上一个<>就像这样: friend void Qsort<>(T a[],int low,int high,bool less); 还有一个要注意

C++中的链表节点用模板类和用普通类来实现的区别

C++中的链表节点通常情况下类型都是一致的.因此我们可以用模板来实现. #include <iostream> using namespace std; template<typename Type>//定义一个模板类必须有的声明 class LinkNode //表示链表节点的类 { public: LinkNode() :m_pnext(nullptr){}//构造函数,在函数体内实现的相当于默认在前面加了inline关键字修饰 LinkNode(Type item, Link

模板类的定义和实现可以不在同一个文件中

写c++程序时我们经常会把函数的定义写在xxx.h中,把函数的实现写在xxx.cpp, 但是当我们写带模版的函数和类时,这样写 就会出现问题,如下: stack.h //stack.h #ifndef STACK_HPP #define STACK_HPP #include <vector> #include <stdexcept> template<typename T, typename TContainer = std::vector<T>> clas

模板类的全特化、偏特化

我们先来定义一个普通的模板类 1 template<class T> 2 struct Test 3 { 4 Test(){ cout << "模板类" << endl; } 5 }; 我们再来调用一下: 1 int main() 2 { 3 Test<char> t1; 4 Test<int> t2; 5 Test<int *> t3; 6 return 0; 7 } 输出的结果1: 模板类 模板类 模板类 如果

Vector模板类

1 #include "stdafx.h" 2 typedef int Rank; //秩 3 #define DEFAULT_CAPACITY 3 //默认的初始容量(实际应用中可设置为更大) 4 5 template <typename T> class Vector 6 { //向量模板类 7 protected: 8 Rank _size; int _capacity; T* _elem; //规模.容量.数据区 9 void copyFrom(T const* A