类模板 示例代码


#ifndef ARRAY_CLASS
#define ARRAY_CLASS
#include <iostream>
#include <stdlib.h>
//数组类模板
template <class TA>
class Array
{
public:
Array(int sz = 50); //构造函数
Array(const Array<TA>& A); //拷贝构造函数
~Array(void); //析构函数
//重载下标符"[ ]",使Array对象可以起到C++普通数组的作用
TA& operator[ ](int i);
private:
TA* a; //TA类型指针,用于存放动态分配的数组内存首地址
int size; //数组大小(元素个数)
};
//以下为类成员函数的实现
// 构造函数
template <class TA>
Array<TA>::Array(int sz)
{
size = sz; // 将元素个数赋值给变量size
a = new TA[size]; //动态分配size个TA类型的元素空间
}
// 析构函数
template <class TA>
Array<TA>::~Array(void)
{
delete[] a;
}
// 拷贝构造函数
template <class TA>
Array<TA>::Array(const Array<TA>& X)
{
//从对象X取得数组大小,并赋值给当前对象的成员
int n = X.size;
size = n;
//为对象申请内存并进行出错检查
a = new TA[n]; // 动态分配n个TA类型的元素空间
// 从对象X复制数组元素到本对象
TA* src = X.a; // X.a是对象X的数组首地址
TA* dest = a; // a是本对象中的数组首地址
while (n--) // 逐个复制数组元素
*dest++ = *src++;
}
// 重载下标操作符,实现与普通数组一样通过下标访问元素,并且具有越界检查功能
template <class TA>
TA& Array<TA>::operator[ ] (int n)
{
// 检查下标是否越界
if (n < 0 || n > size - 1)
{
cout << n << " is out_of_bound.\n";
exit(1);
}
return a[n]; // 返回下标为n的数组元素
}
#endif // ARRAY_CLASS
#pragma once






#include <iostream>
#include <stdlib.h>
#include "array.h"
using std::cout;
using std::endl;
int main()
{
int i;
//数组类模板Array实例化为int 型模板类,创建整型数组
Array<int> intarr1(10);
for (i = 0; i<10; i++)
intarr1[i] = i + 3; //数组元素作左值
cout << "int array1:";
for (i = 0; i<10; i++)
cout << intarr1[i] << " "; //返回元素值
cout << endl;
//数组类模板Array实例化为float型模板类,创建实型数组
Array<double> douarr(8);
for (i = 0; i<8; i++)
douarr[i] = (double)(i + 1)*3.14;
cout << "double array:";
for (i = 0; i<8; i++)
cout << douarr[i] << " ";
cout << endl;
//数组类模板Array实例化为int 型模板类,利用数组intarr1拷贝生成整型数组intarr2
Array<int> intarr2(intarr1);
cout << "int array2:";
for (i = 0; i<10; i++)
cout << intarr2[i] << " ";
cout << endl;
//下标越界检查
intarr1[20] = 100;
return 0;
}





/*类模板静态成员示例*/
#include <iostream>
using std::cout;
using std::endl;
template <class T>
class ClassA
{
public:
T getValue()
{
return a;
}
void setValue(T val)
{
a = val;
}
private:
static T a; //类模板静态成员a
};
int ClassA < int > ::a = 100; //类模板静态成员a的初始化
char ClassA < char > ::a = 'Z'; //类模板静态成员a的初始化
int main()
{
ClassA< int > ObjectInt1, ObjectInt2;
ClassA< char > ObjectChar1, ObjectChar2;
ObjectInt1.setValue(200);
cout << ObjectInt2.getValue() << " , " << ObjectChar2.getValue();
cout << endl;
ObjectChar1.setValue('X');
cout << ObjectInt2.getValue() << " , " << ObjectChar2.getValue();
cout << endl;
return 0;
}




/* 一个通用数组类模板友元的实例 */

/* 模板类的友元函数分为:约束(bound)友元函数 和 非约束(unbound)友元函数*/

#include <iostream>

using std::cout;
using std::endl;

template <typename T> class Array;
template <typename T> void Print(Array <T> & myarr);
template<class T1, class T2>
void ItoF (Array <T1> &Iarr, Array <T2> &Carr);


template <class T>
class Array //通用数组类模板定义
{
public:
Array(int s) // 构造函数
{
size = s;
elem = new T[size]; //分配数组空间
}
Array()
{
delete[]elem;
}
T& operator[] (int index) //下标运算符[]重载函数
{
return elem[index];
}
// 未实例化友元函数模板声明
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
friend void Print<>(Array <T> & myarr);
// 实例化的友元函数模板声明
friend void ItoF<>(Array <int> &Iarr, Array <char> &Carr);
private:
T* elem;
int size;
};
// 未实例化友元函数模板定义
template<class T>
void Print (Array <T> &myarr)
{
for (int i = 0; i < myarr.size; i++)
cout << myarr.elem[i] << " ";
}
//void Print(Array <char> &myarr)
//{
// for (int i = 0; i < myarr.size; i++)
// cout << myarr.elem[i] << " ";
//}
// 实例化的友元函数模板定义
template<class T1, class T2>
void ItoF (Array <T1> &Iarr, Array <T2> &Carr)
{
Carr.size = Iarr.size;
for (int i = 0; i < Iarr.size; i++)
//强制类型转换,将T1类型的数组元素转换成为T2类型数组元素
Carr.elem[i] = T2(Iarr.elem[i]);
}
int main()
{
Array< int > arri(10); // 生成 int类型模板类和创建int类型数组对象
Array< char > arrc(10); // 生成 char类型模板类和创建char类型数组对象
for (int i = 0; i < 10; i++)
arri[i] = i + 65;
Print(arri); cout << endl;
ItoF(arri, arrc);
Print(arrc); cout << endl;
return 0;
}





// manyfrnd.cpp -- unbound template friend to a template class
#include <iostream>
using std::cout;
using std::endl;

template <typename T>
class ManyFriend
{
private:
T item;
public:
ManyFriend(const T & i) : item(i) {}
template <typename C, typename D> friend void show2(C &, D &);
};

template <typename C, typename D> void show2(C & c, D & d)
{
cout << c.item << ", " << d.item << endl;
}

int main()
{
ManyFriend<int> hfi1(10);
ManyFriend<int> hfi2(20);
ManyFriend<double> hfdb(10.5);
cout << "hfi1, hfi2: ";
show2(hfi1, hfi2);
cout << "hfdb, hfi2: ";
show2(hfdb, hfi2);
// std::cin.get();
return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值