#include <iostream>
using namespace std; template <typename T>
class MyVector
{ friend ostream & operator<< <T>(ostream &out, const MyVector &obj);
public:
MyVector(int size = ); //构造函数
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=; 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=; 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 = ;
}
} 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 = ;
} //根据a1分配内存
m_len = obj.m_len;
m_space = new T[m_len]; //copy数据
for (int i=; 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 = ;
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", ), t2("t2", ), t3("t3", ), t4("t4", ); MyVector<Teacher> tArray(); tArray[] = t1;
tArray[] = t2;
tArray[] = t3;
tArray[] = t4; for (int i=; i<; i++)
{
Teacher tmp = tArray[i];
tmp.printT();
}
cout << tArray; system("pause");
}
void main02()
{
MyVector<char> myv1();
myv1[] = 'a';
myv1[] = 'b';
myv1[] = 'c';
myv1[] = 'd'; cout << myv1; system("pause");
} void main01()
{
MyVector<int> myv1(); for (int i=; i<myv1.getLen(); i++)
{
myv1[i] = i+;
cout << myv1[i] << " ";
}
cout << endl; MyVector<int> myv2 = myv1;
for (int i=; i<myv2.getLen(); i++)
{
cout << myv2[i] << " ";
} cout << myv2 << endl; cout<<"hello..."<<endl;
system("pause");
return ;
}

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

  1. C++_类入门5-智能指针模板类

    智能指针是行为类似于指针的类对象,但这种对象还有其他功能. 本节介绍三个可帮助管理动态内存分配的智能指针模板(auto_ptr.unique_ptr和shared_ptr). void remodel ...

  2. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  3. 模板类 error LNK2019: 无法解析的外部符号

    如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现"error LNK2019: 无法解析的外部符号 "的错误. 解决方法有: 第一种方法,就是把类模板中成员函数的声明和 ...

  4. 关于g++编译模板类的问题

    今天搞了我接近4个小时,代码没错,就是调试没有通过,无论怎么也没有想到是编译器的问题 g++不支持c++模板类 声明与实现分离,都要写到.h文件里面. 以后记住了.

  5. C++11特性(模板类 initializer_list)

    [1]initializer_list模板类 C++primer 原文如下: 通读原文相关篇幅,分析解读内容如下: 提供initializer_list类的初衷,为了便于将有限个同一类型(或可转换为同 ...

  6. C++11模板类使用心得

    1.推荐使用std::shared_ptr<TaskT>代替指针TaskT*使用,shared_ptr是一种智能指针,能自主销毁释放内存,在c++11中被引入,在多线程编程中有很大的用处, ...

  7. c++模板类

    c++模板类 理解编译器的编译模板过程 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”.看看我们几乎每天都能遇到的模板类吧,如S ...

  8. C++ 模板函数与模板类

    一.模板函数 函数模板提供了一类函数的抽象,即代表了一类函数.当函数模板被实例化后,它会生成具体的模板函数.例如下面便是一个函数模板:

  9. 模板类重载<<运算符

    写了一个Matrix模板类,需要重载<<, 1.需要友元函数 2.需要此函数的实现在.h中(本人试验出来的,放在.cpp中编译不通过) template <typename T> ...

随机推荐

  1. ADO.NET 中的数据并发

    当多个用户试图同时修改数据时,需要建立控制机制来防止一个用户的修改对同时操作的其他用户所作的修改产生不利的影响.处理这种情况的系统叫做“并发控制”.并发控制的类型通常,管理数据库中的并发有三种常见的方 ...

  2. C++设计模式——建造者模式

    建造者模式 在GOF的<设计模式 可复用面向对象软件的基础>中是这样说的:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 这句话,似懂非懂的.一个复杂对象的创建 ...

  3. Ubuntu中、英文环境设置

    改变ubuntu的中英文显示需要修改文件/etc/default/locale,具体设置过程为: 1.打开/etc/default/locale文件 #sudo vim /etc/default/lo ...

  4. 机器学习----分布问题(二元,多元变量分布,Beta,Dir)

    这涉及到数学的概率问题. 二元变量分布:          伯努利分布,就是0-1分布(比如一次抛硬币,正面朝上概率) 那么一次抛硬币的概率分布如下: 假设训练数据如下: 那么根据最大似然估计(MLE ...

  5. SDN环境搭建(mininet,OVS,ryu安装及命令)

    1.mininet安装与使用 1.1mininet安装 ubuntu 12.04/14.04/14.10      命令行  sudo apt-get install mininet 1.2 mini ...

  6. Phonegap学习点滴(2) -- 网络状态检测

    Phonegap学习点滴(2) -- 网络状态检测  http://blog.csdn.net/x251808026/article/details/16992943 方法一:在MainActivit ...

  7. java识别文件或字符串的编码格式

    1, 用juniversalchardet: http://code.google.com/p/juniversalchardet/ 官方示例: import org.mozilla.universa ...

  8. Spring+Quartz 整合二:调度管理与定时任务分离

    新的应用场景:很多时候,我们常常会遇到需要动态的添加或修改任务,而spring中所提供的定时任务组件却只能够通过修改xml中trigger的配置才能控制定时任务的时间以及任务的启用或停止,这在带给我们 ...

  9. Edit Box多行显示时如何使滚动条始终在下方

    两种方法: ①  CEdit *pEdit = ((CEdit*)GetDlgItem(IDC_EDIT_RXDATA)); pEdit->LineScroll(pEdit->GetLin ...

  10. Linux设置禁止用户登陆

    Linux设置禁止用户登陆 vim /etc/shadow 第二栏(密码栏)设为*,会丢失密码 usermod -L username # -L Lock; -U Unlock chsh userna ...