#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;
}
分享到:
相关推荐
3. 提高代码复用:公共部分的代码在抽象类中实现,避免重复编写。 在实际应用中,模板方法模式常用于框架设计,例如UI框架的事件处理、数据访问对象(DAO)的增删改查操作等。通过提供一个基础的执行流程,并允许...
附件是一个简单的Bootstrap模板示例代码,它展示了一个基本的网页结构,包括导航栏、一个带有标题和段落的容器以及一个简单的脚注。 这段代码使用了Bootstrap 5的样式和组件。它包括: 一个响应式的导航栏,带有...
在C++编程语言中,模板是一种强大的特性,它允许我们编写通用代码,以处理不同类型的对象,无需重复编写相似的代码。本篇文章将深入探讨C++模板的基本概念、类型和函数模板,以及模板特化和元编程等高级主题。 首先...
本文主要围绕`art-template`这一前端模板引擎,通过`art-template-test`示例代码来深入探讨其核心概念、使用方法以及在实际项目中的应用。 `art-template`是一个轻量级、高性能的JavaScript模板引擎,它旨在解决...
本示例代码“ComplicatedTemplate.rar”着重于WPF中的自定义复杂模板,这是一个关键功能,允许开发者根据需求创建独特且复杂的用户界面元素。 在WPF中,模板主要用于定义UI元素的外观。有两类模板:数据模板...
3、示例有本地模板和远程模板之分,可杜绝pdf标题丢失的问题; 4、资源概要:先阅读README.md文档,然后根据文档中的资源示例运行代码,有postman和内部调用两种方式; 5、项目目录other/下面有示例文件可快速入手; ...
主要介绍了java实现微信公众平台发送模板消息的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
下面是一个简单的函数模板示例,用于交换两个变量的值: ```cpp template void swap(T& a, T& b) { T temp = a; a = b; b = temp; } ``` 这个模板可以处理`int`、`float`、`double`甚至是自定义数据类型。 **...
示例代码会展示如何创建代理类并让它代替原始对象执行操作。 6. 建造者模式:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。在代码中,你会看到如何构建一个建造者接口和各种具体建造者,...
内容概要:Vue3+vite搭建基础架构示例代码。通过该代码示例熟悉vue3写法,以及熟悉router、i18n语言、store全局属性使用、styles全局样式、utils工具类使用、component组件使用、layout通用基础架构设计、以及依赖...
// 获取用户实体的示例代码,实际应用中应从数据库或其他地方获取 private User getUser() { return new User("John Doe", "john.doe@example.com"); } } ``` 至此,你已经成功地在Spring Boot中集成了邮件服务...
C++中的函数模板和类模板是泛型编程的重要组成部分,它们允许我们编写更为通用的代码,从而能够处理不同数据类型的对象。在这个实验报告中,我们将深入理解这些概念,并通过具体的编程实践来掌握它们。 首先,我们...
《VC++深入详解》是一本专注于讲解Microsoft Visual C++(简称VC++)编程技术的书籍,结合了示例代码和课件,旨在帮助读者全面掌握并深入理解VC++的各个方面。该资源包包含了丰富的实例代码,是学习和提升VC++编程...
示例代码0301至0304可能涵盖创建和填充表格,` PdfPTable`类用于创建表格,`Cell`类用于定义单元格。 ```csharp PdfPTable table = new PdfPTable(3); // 3列 table.AddCell("Column 1"); table.AddCell("Column 2...
"示例代码"可能涵盖以上提到的任意或所有概念,每个示例通常会包含完整的类定义、方法实现、主函数(main method)以及必要的注释,以解释代码的功能和工作原理。通过学习和实践这些示例,开发者能够快速掌握Java...
Vue v-for computed 生命周期和模板引用 语法示例演示代码Vue v-for computed 生命周期和模板引用 语法示例演示代码Vue v-for computed 生命周期和模板引用 语法示例演示代码Vue v-for computed 生命周期和模板引用 ...
"Java示例代码"通常指的是为了教学、演示或测试特定功能而编写的简短Java程序。这些代码片段可以帮助开发者理解Java语法、类库以及编程概念。 在Java编程中,一些重要的知识点包括: 1. **基础语法**:Java的基础...
C++模板元编程是一种在编译时执行计算和创建代码的技术,它利用了C++模板系统的能力,将编程任务从运行时转移到了编译时...压缩包中的代码示例提供了实践这一技术的机会,对于学习和掌握模板元编程有着宝贵的参考价值。
对C++函数模板的代码实现对C++类模板的代码实现对C++类模板继承的代码实现代码对应的文章:https://blog.csdn.net/ChuJian_cao/article/details/134779209