C++基础(11)类模板

2023-10-31

1. 类模板

类模板和函数模板的定义和使用类似,我们已经进行了介绍。有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同。

  • 类模板用于实现类所需数据的类型参数化
#include<iostream>
#include<string>
using namespace std;
//类模板和函数模板的定义和使用类似,我们已经进行了介绍。有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同。
//类模板用于实现类所需数据的类型参数化
template<class T1,class T2 = int>//类模板可以指定一个默认参数类型
class person
{
public:
	person(T1 name,T2 age)
	{
		this->n_name =name;
		this->n_age =age;
	}
	void printer()
	{
		cout<<"person.n_name:"<<this->n_name<<" "<<"person.n_age:"<<this->n_age<<endl;
	}
private:
	T1 n_name;
	T2 n_age;
};
void main(){
	//类型//person p;//类模板不能进行自动推导 

	person<string,int>p1("jojo",20);
	p1.printer();

}

在这里插入图片描述

1.1 类内成员函数的创建时机

#include<iostream>
#include<string>
using namespace std;

class person1
{
public:
	void showperson1()
	{
		cout<<"person1"<<endl;
	}
};
class person2
{
	void showperson2()
	{
		cout<<"person2"<<endl;
	}
};
template<class T>
class typeend
{
public:
	T obj;
	//成员函数不会一开始就创建出来,而是在运行的时候创建
	void show1()
	{
		obj.showperson1();
	}
	void show2()
	{
		obj.showperson2();
	}
};

void main()
{
	typeend<person1>p1;//不会报错,生成类的时候并没有直接生成成员函数
	p1.show1();
	//p1.show2();
}

成员函数不会一开始就创建出来,而是在运行的时候创建

在这里插入图片描述

1.3 类模板做函数参数

//类模板
template<class NameType, class AgeType>
class Person{
public:
	Person(NameType name, AgeType age){
		this->mName = name;
		this->mAge = age;
	}
	void PrintPerson(){
		cout << "Name:" << this->mName << " Age:" << this->mAge << endl;
	}
public:
	NameType mName;
	AgeType mAge;
};

//类模板做函数参数
void DoBussiness(Person<string,int>& p){
	p.mAge += 20;
	p.mName += "_vip";
	p.PrintPerson();
}

int main(){

	Person<string, int> p("John", 30);
	DoBussiness(p);

	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述

1.4类模板的派生类

#include<iostream>
#include<string>
using namespace std;
template<class nametaype,class agetype >
class person
{
public:
	person(nametaype name,agetype age)
	{
		this->nname = name;
		this->nage =age;
	}
	void showperson()
	{
		cout << "name: " << this->nname<< " age: " << this->nage<< endl;
	}
private:
	nametaype nname;
	agetype nage;
};
//继承模板是必须告诉派生类T的类型,否则T无法分配内存
class teacher:public person<string,int>
{
public:
	teacher(string name,int age):person(name,age){}

};
//派生类也是模板类
template<class T1,class T2,class T3>
class teacher1:public person<T2,T3>//用户指定类型
{
public:
	teacher1(T1 a,T2 name,T3 age):person(name,age){}
	T1 tmp;
	void typeprint()
	{
		cout<<typeid(T1).name()<<endl;//输出a的类型
		cout<<typeid(T2).name()<<endl;//输出name的类型
		cout<<typeid(T3).name()<<endl;//输出age的类型
	}
};

void main(){
	teacher1<int,string,int>p1(10,"laowang",20);
	p1.typeprint();
	teacher p2("孙悟空",500);
	p2.showperson();
}

在这里插入图片描述

1.5 类模板类内实现

#include<iostream>
#include<string>
using namespace std;
template<class NameType, class AgeType>
class Person
{
public:
	Person(NameType name, AgeType age)
	{
		this->mName = name;
		this->mAge = age;
	}
	void showPerson()
	{
		cout << "name: " << this->mName << " age: " << this->mAge << endl;
	}
public:
	NameType mName;
	AgeType mAge;
};

void test01()
{
	//Person P1("德玛西亚",18); // 类模板不能进行类型自动推导 
	Person<string, int>P1("德玛西亚", 18);
	P1.showPerson();
}
void main()
{
	test01();
}

在这里插入图片描述

1.6 类模板类外实现

#include<iostream>
#include<string>
using namespace std;


template<class T1, class T2>
class Person{
public:
	Person(T1 name, T2 age);
	void showPerson();
public:
	T1 mName;
	T2 mAge;
};


//类外实现
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age){
	this->mName = name;
	this->mAge = age;
}


template<class T1, class T2>
void Person<T1, T2>::showPerson(){
	cout << "Name:" << this->mName << " Age:" << this->mAge << endl;
}

void test()
{
	Person<string, int>p("Trume", 20);
	p.showPerson();
}

int main(){

	test();
	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述

2. 类模板的头文件书写

类模板的声明和实现放到一个文件中,我们把这个文件命名为.hpp

#pragma once
#include<iostream>
#include<string>
using namespace std;


template<class T1,class T2>
class Person{
public:
	Person(T1 name,T2 age);
	void ShowPerson();
public:
	T1 mName;
	T2 mAge;
};

template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age){
	this->mName = name;
	this->mAge = age;
}

template<class T1, class T2>
void Person<T1, T2>::ShowPerson(){
	cout << "Name:" << this->mName << " Age:" << this->mAge << endl;
}

头文件.hpp调用

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string>
#include"Person.hpp"

//模板二次编译
//编译器编译源码 逐个编译单元编译的

int main(){

	Person<string, int> p("Obama", 20);
	p.ShowPerson();

	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述

类模板需要二次编译,在出现模板的地方编译一次,在调用模板的地方再次编译。
C++编译规则为独立编译。

1.9 模板类碰到友元函数

两种实现方式:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <string>

//类外实现友元函数需要先声明类
template<class T1, class T2> class Person;
//告诉编译器这个函数模板是存在
template<class T1, class T2> void PrintPerson2(Person<T1, T2>& p);

//友元函数在类内实现
template<class T1, class T2>
class Person{
	//1. 友元函数在类内实现
	friend void PrintPerson(Person<T1, T2>& p){
		cout << "Name:" << p.mName << " Age:" << p.mAge << endl;
	}

	//2.友元函数类外实现
	//告诉编译器这个函数模板是存在
	friend void PrintPerson2<>(Person<T1, T2>& p);


public:
	Person(T1 name, T2 age){
		this->mName = name;
		this->mAge = age;
	}
	void showPerson(){
		cout << "Name:" << this->mName << " Age:" << this->mAge << endl;
	}
private:
	T1 mName;
	T2 mAge;
};

void test01()
{
	Person <string, int>p("Jerry", 20);
	PrintPerson(p);
}


// 类模板碰到友元函数
//友元函数类外实现  加上<>空参数列表,告诉编译去匹配函数模板
template<class T1 , class T2>
void PrintPerson2(Person<T1, T2>& p)
{
	cout << "Name2:" << p.mName << " Age2:" << p.mAge << endl;
}

void  test02()
{
	Person <string, int>p("Tom", 20);
	PrintPerson2(p);  
}

int main(){

	//test01();
	test02();
	return EXIT_SUCCESS;
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础(11)类模板 的相关文章

  • 无法使用 rtools40 和 R 4.0 构建 RDCOMClient

    不久前 我创建了 RDCOMClient 包的一个分支 以使其与 R 3 6 一起工作 https github com dkyleward RDCOMClient https github com dkyleward RDCOMClien
  • 自动映射器多对一映射

    我想将一种类型映射到另一种类型 但我在第一种类型中有多个属性 需要获取其他类型的一个属性 例如 public class A public int a get set public int b get set public int c ge
  • 不同翻译单元中字符串文字的内存地址是否相同?

    假设我们有以下 cpp 文件 include
  • 进入嵌入式[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 c11 标准和 clang 来使用 strcpy_s

    我正在运行 OS X Sierra 并尝试编译一个使用的 c 程序strcpy s 但是我安装的 clang 编译器使用的是 c99 标准 但是据我读到的 https embeddedgurus com barr code 2017 08
  • 不要覆盖 Azure Blob 存储

    我有一种将文件添加到 Azure Blob 存储的方法 问题是我试图指定一个条件 在该条件下它不会覆盖 blob 而只是添加到其中 我正在尝试使用参数访问条件 但是 VS 说这个方法不能采用两个参数 async void archiveNe
  • 有什么办法可以让这个 C# 代码更快吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在读取一个大文件 X12 并解析其中的信息 我有两个瓶颈功能 我似乎无法解决 read line 和 get element 有什
  • 从 C# 访问 COM vtable

    C 中有没有办法访问 COM 对象的虚拟方法表以获取函数的地址 经过大量搜索和拼凑不同的部分解决方案后 我弄清楚了如何做到这一点 首先 您需要为您尝试访问的对象定义 COM 组件类 ComImport Guid InterfaceType
  • Image.FromStream() 方法返回 Invalid Argument 异常

    我正在从智能相机成像器捕获图像 并通过套接字编程从相机接收字节数组 NET 应用程序是客户端 相机是服务器 问题是我在运行时收到 System InvalidArgument 异常 private Image byteArrayToImag
  • 从 ASP.NET Web API 返回 HTML

    如何从 ASP NET MVC Web API 控制器返回 HTML 我尝试了下面的代码 但由于未定义 Response Write 而出现编译错误 public class MyController ApiController HttpP
  • ASP Net Core 属性路由和双正斜杠

    正如所指出的here https stackoverflow com a 20524044 3129340 URL 中包含双斜杠是有效的 我有一个使用属性路由的 ASP Net Core 项目 一个名为GroupController用于处理
  • IOS Box2D - 身体遵循基于速度波动的点数组的特定路径

    我有一个关于身体的问题 它遵循特定的路径 首先是将身体移动到目标点的方法 const float destinationControl 0 3f b2Vec2 targetPosition path counter b2Vec2 missi
  • 在另一个类中使用一个类对象?

    我正在用 c 制作应用程序 在该应用程序中 我有一个类DataCapture cs 在同一个应用程序中 我有另一个类Listner cs 在 Listner cs 类中 我想使用以下对象DataCapture cs不创建新对象DataCap
  • 在 C++ 中运行 python [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个用 C 编写的应用程序和一个测试系统 也是用 C 编写的 测试系统非常复杂并且很难改变 我只想做一些小的改变 我的班级是这样的
  • 如何同时正确使用管道和信号?

    我有 2 个孩子 我想将信号从孩子发送到父母 并将答案 随机数 为什么 为什么不 命名管道从父母发送到每个孩子 我有这个代码 include
  • GCC编译非常慢(文件大)

    我正在尝试编译一个大的 C 文件 专门用于 MATLAB mexing C 文件大约 20 MB 可用来自 GCC 错误跟踪器 https gcc gnu org bugzilla attachment cgi id 36632如果你想玩一
  • 您可以从 AuthorizeAttribute 返回 HTTP 响应而不引发异常吗?

    我在各种控制器上使用 AuthorizeAttribute 可能需要根据请求本身的某些属性返回 403 或 429 请求过多 我完全在自定义 OnAuthorization 实现中实现了它 然后在必要时抛出一个带有适当响应代码的新 Http
  • 即使没有任何转换,也违反了 C 中的严格别名?

    How can i and u i在此代码中打印不同的数字 即使i定义为int i u i 我只能假设我在这里触发了 UB 但我不知道具体是如何触发的 ideone演示 http ideone com Gcv5Xm如果我选择 C 作为语言
  • 删除指针后将其设为 NULL 是一个好习惯吗?

    我首先要说的是 使用智能指针 您将永远不必担心这个问题 下面的代码有什么问题 Foo p new Foo use p delete p p NULL 这是由答案和评论 https stackoverflow com questions 19
  • 从 C# 应用程序调用 ASP.net Web 服务

    我有个问题 我如何调用 Web 服务并从 C 桌面应用程序获取结果 我正在制作一个桌面应用程序 我希望它能够连接到我的在线 ASP net Web 服务 这怎么可能 在 解决方案资源管理器 中 右键单击项目节点并选择 添加 Service参

随机推荐

  • 我的一切主要想法和想做的东西

    一 VFD时钟 目前基本已经完成 但是只卖出不到50个 没找到原因 是营销不够 市场份额太少 还是产品本身有问题 目前自己想对满意 不会再更新 二 低功耗手表 老李做到2 0版本 缺外壳 目前有老板介入 但是进度未知 主打一个续航编写 三
  • Qt 获取顶级窗口(top-level window)

    在Qt中 可以使用 QWidget window 函数来获取窗口的顶级窗口 top level window 顶级窗口是指没有父窗口的窗口 通常是应用程序的主窗口或独立的对话框窗口 include
  • The type org.springframework.dao.DataAccessException cannot be resolved. It is indirectly referenced

    今天使用Spring Cloud Mybatis Plus3 x 搭建微服务项目时 提示如下错误信息 The type org springframework dao DataAccessException cannot be resolv
  • vue-cli3搭建多入口应用项目搭建以及webpack配置

    我们平时开发 vue项目的时候 就有一种感觉就是 vue就像是专门为单页应用而诞生的 因为人家的官方文档中也说了 其实不是的 因为vue在工程化开发的时候依赖于 webpack 而webpack是将所有的资源整合到一块后形成一个html文件
  • Python基础(三)_函数和代码复用

    三 函数和代码复用 一 函数的基本使用 1 函数的定义 函数是一段具有特定功能的 可重用的语句组 用函数名来表示并通过函数名进行功能调用 函数也可以看作是一段具有名字的子程序 可以在需要的地方调用执行 不需要在每个执行的地方重复编写这些语句
  • HJ32 密码截取(java详解)(动态规划)

    hello world 你好 世界 想要了解这题的动态规划 提议先了解这题的 中心扩散法 解题思路 最长回文子串的中心扩散法 遍历每个字符作为中间位 进行左右比较 算法流程 从右到左 对每个字符进行遍历处理 并且每个字符要处理两次 因为回文
  • 二手打印机如何挑选?

    打印机作为生产力工具 最重要的是 稳定性 可靠性 以及使用成本 常用的打印机分为三种 分别是 激光打印机 喷墨打印机 针式打印机 不管你是去网店还是实体店铺购买打印机 首先你要了解自己的需求 打印机作为商品 没有好与不好 只有适不适合你 一
  • Python编程基础题(20-宇宙无敌加法器)

    Description Input 输入首先在第一行给出一个 N 位的进制表 0 lt N 20 以回车结束 随后两行 每行给出一个不超过 N 位的非负的 PAT 数 Output 在一行中输出两个 PAT 数之和 Sample Input
  • 点位运动

    梯形速度规划是最简单的速度规划方法 加速度是常数 规划过程中只需要控制速度和位移与时间的关系 如图所示 整个过程分为 加速段 匀速段 减速段 每一个轴在规划静止时都可以设置为点位运动 在点位运动模式下 各轴可以独立设置目标位置 目标速度 加
  • linux/windows下查看目标文件.a/.lib的函数符号名称

    1 linux下 objdump t 查看对象文件所有的符号列表 例如 objdump t libtest o 2 nm列出目标文件 o 的符号清单 例如 nm s filename a filename o a out 3 列出所有定义的
  • jq中快速返回祖先元素

    div class one div class two div class three div class focus 我是这个div div div div div
  • 解决页面favicon.ico文件不存在提示404问题

    所谓favicon 即Favorites Icon的缩写 顾名思义 便是其可以让浏览器的收藏夹中除显示相应的标题外 还以图标的方式区别不同的网站 当然 这不是Favicon的全部 根据浏览器的不同 Favicon显示也有所区别 在大多数主流
  • 逗号和分号

    上面的程序
  • 将python代码打包成可执行文件

    文章目录 打包工具 使用 pyinstaller 安装pyinstaller库 打包 Python是一种高级编程语言 它具有易学易用 跨平台等优点 因此在开发中得到了广泛的应用 然而 Python代码需要在Python解释器中运行 这对于一
  • UML类图几种关系的总结

    UML类图几种关系的总结 转载链接 http blog csdn net sunboy 2050 article details 9211457 UML类图 描述对象和类之间相互关系的方式包括 依赖 Dependency 关联 Associ
  • mac生成树形结构

    第一步 安装tree brew install tree 第二步 在要展示树结构的文件里面打开终端 运行命令 tree d 只显示文件夹 tree L n 显示项目的层级 n表示层级数 比如想要显示项目三层结构 可以用tree l 3 tr
  • firefox安装selenium插件

    1 目前新版类似Firefox58不兼容 打开 https addons mozilla org en US firefox addon selenium ide 网址 显示add to firefox为灰色 下载Firefox48即可 2
  • R:RStudio和RStudio Server

    RStudio是R语言开发中的利器 是最好用的R语言IDE集成环境 RStudio Server更是利器中的神器 不仅提供了Web的功能 可以安装到远程服务器上 通过Web进行访问 还支持多用户的协作开发 RStudio 是一个强大的 免费
  • IDEA——手把手教你mybatis的使用(新手教程)

    说到Mybatis 很多人不知道这是用来干什么的 简单来说就是用来优化JDBC的使用 我们可以理解为一个这样的流程 数据库 gt JDBC gt MyBatis gt Java 今天来教一下简单的mybatis使用方法 对于初学者很友好 目
  • C++基础(11)类模板

    1 类模板 类模板和函数模板的定义和使用类似 我们已经进行了介绍 有时 有两个或多个类 其功能是相同的 仅仅是数据类型不同 类模板用于实现类所需数据的类型参数化 include