C++类模板详解

目录

 

 1.模板的概念 

2.类模板

1.类模板基本语法

2.类模板与函数模板区别

3.类模板中成员函数创建时机

4.类模板对象做函数参数

typeid().name()

 5.类模板与继承

6.类模板成员函数类外实现 

7.类模板分文件编写

#pragma once

8.类模板与友元


 1.模板的概念 

比如在制作ppt时,我们常用到ppt的模板,但一个ppt模板不能适用于所有的主题,要根据不同的情况来选择合适的模板。 

2.类模板

1.类模板基本语法

#include<bits/stdc++.h>
using namespace std;template<class nametype,class agetype>
class person
{
public:person(nametype name,agetype age){this -> name = name,this -> age = age;}void show(){cout << this -> name << ' ' << this -> age;}nametype name;agetype age;
};int main()
{person<string,int> p1("xiaoming",18);p1.show();return 0;
}

 

2.类模板与函数模板区别

#include<bits/stdc++.h>
using namespace std;template<class nametype,class agetype = int>//默认参数设置为int
class person
{
public:person(nametype name,agetype age){this -> name = name,this -> age = age;}void show(){cout << this -> name << ' ' << this -> age;}nametype name;agetype age;
};int main()
{//上面将默认参数设置为int所以这里初始化p1时只写一个string即可person<string> p1("xiaoming",18);p1.show();return 0;
}

3.类模板中成员函数创建时机

#include<bits/stdc++.h>
using namespace std;class person1
{
public:void show1(){cout << "person1" << endl;}
};class person2
{
public:void show2(){cout << "person2" << endl;}
};template<class T>
class myclass
{
public:T obj;void func1(){obj.show1();}void func2(){obj.show2();}
};
//编译器不知道obj是什么数据类型,所以类模板中的函数并不是一开始就创建的
//而是在模板调用时再生成int main()
{myclass<person1> c;c.func1();return 0;
}

4.类模板对象做函数参数

typeid().name()

用于显示一个变量的数据类型 

#include<bits/stdc++.h>
using namespace std;template<class T1,class T2>
class person
{
public:T1 name;T2 age;person(T1 name,T2 age){this -> name = name,this -> age = age;}void show(){cout << this -> name << ' ' << this -> age << endl;}
};//1、指定传入类型
void printperson1(person<string,int> &p)
{p.show();
}//2.参数模板化
template<class T1,class T2>
void printperson2(person<T1,T2> &p)
{p.show();cout << typeid(T1).name() << endl;cout << typeid(T2).name() << endl;
}//3.整个类模板化
template<class t>
void printperson3(t &p)
{p.show();cout << typeid(t).name() << endl;
}int main()
{person<string,int>p1("xiaoming",18);printperson1(p1);person<string,int>p2("xiaohong",19);printperson2(p2);printperson3(p2);return 0;
}

 

 5.类模板与继承

#include<bits/stdc++.h>
using namespace std;template<class t>
class base
{t a;
};//类模板继承时必须要知道父类中的t的类型
class son1 : public base<int>
{};//如果想灵活指定父类中的t类型,子类也需要变为类模板
template<class t1,class t2>
class son2 : public base<t2>
{
public:t1 obj;
};int main()
{son2<char,int> s;//此时t1会变为char类型,t2会变为int类型,并且父类的t也变为int类型return 0;
}

6.类模板成员函数类外实现 

#include<bits/stdc++.h>
using namespace std;template<class T1,class T2>
class person
{
public:T1 name;T2 age;//成员函数类内声明person(T1 name,T2 age);// {// this -> name = name,this -> age = age;// }void show();// {// cout << this -> name << ' ' << this -> age << endl;// }
};//构造函数类外实现
//要提供作用域,告诉编译器T1,和T2是什么,告诉编译器这是一个类模板的类外函数实现
template<class T1,class T2>
person<T1,T2>::person(T1 name,T2 age)
{this -> name = name,this -> age = age;
}//成员函数类外实现
template<class T1,class T2>
void person<T1,T2>::show()
{cout << this -> name << ' ' << this -> age << endl;
}int main()
{person<string,int>p1("xiaoming",18);p1.show();return 0;
}

 

7.类模板分文件编写

 

#pragma once

防止头文件重复包含 

8.类模板与友元

#include<bits/stdc++.h>
using namespace std;//让编译器提前知道存在一个名称为person的类模板
template<class T1,class T2>
class person;template<class T1,class T2>
void printperson2(person<T1,T2> p)
{cout << "类外实现" << ' ' <<  p.name << ' ' << p.age << endl;
}template<class T1,class T2>
class person
{
private:T1 name;T2 age;public://全局函数类内实现//加上friend使得它可以访问到私有成员name和agefriend void printperson(person<T1,T2> p){cout << "类内实现" << ' ' << p.name << ' ' << p.age << endl;}//全局函数类外实现//加空模板参数列表//如果全局函数是类外实现的话,需要让编译器提前知道函数的存在friend void printperson2<>(person<T1,T2> p);person(T1 name,T2 age){this -> name = name,this -> age = age;}};int main()
{person<string,int>p1("xiaoming",18);printperson(p1);printperson2(p1);return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业有了ERP,为什么还要上BI?

在我们以往和企业的沟通过程中&#xff0c;我们发现还是有相当多的一部分企业对于商业智能 BI 了解不多&#xff0c;或者对商业智能 BI 的理解仅停留在花花绿绿的可视化页面上&#xff0c;要么就是提出以下类似问题&#xff1a; 财务部门&#xff1a;BI 的财务分析指标也就是三…

【算法分析与设计】最大二叉树

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最…

【C#】SixLabors.ImageSharp和System.Drawing两者知多少

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

Spring注解之参数校验

目录 一些常用的字段验证的注解 验证请求体(RequestBody) 验证请求参数(Path Variables 和 Request Parameters) 数据的校验的重要性就不用说了&#xff0c;即使在前端对数据进行校验的情况下&#xff0c;我们还是要对传入后端的数据再进行一遍校验&#xff0c;避免用户绕过…

去中心化时代,品牌如何赢得确定性增长

去中心化时代下&#xff0c;品牌面临众多挑战。在如今复杂的环境下&#xff0c;有很多不确定的因素&#xff0c;流量、资本等等&#xff0c;这些都是品牌发展过程中的不确定因素&#xff0c;越是复杂的环境下&#xff0c;品牌越要保证自己核心优势&#xff0c;找到并放大我们的…

C语言数据结构基础-单链表

1.链表概念 在前面的学习中&#xff0c;我们知道了线性表&#xff0c;其中逻辑结构与物理结构都连续的叫顺序表&#xff0c;那么&#xff1a; 链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 2.链表组…

【软件设计师】多元化多方面了解多媒体技术的内容

&#x1f413; 多媒体技术基本概念 多媒体主要是指文字、声音和图像等多种表达信息的形式和媒体&#xff0c;它强调多媒体信息的综合和集成处理。多媒体技术依赖于计算机的数字化和交互处理能力&#xff0c;它的关键是信息压缩技术和光盘存储技术。 亮度 亮度是光作用于人眼时所…

linux+samba共享文件夹-window可以直接上传服务器数据(只能读取不能写入问题)

项目场景&#xff1a; 因为要上传本地瓦片100gb左右&#xff0c;下载再上传时间太长了&#xff0c;最后想到直接下载在服务器&#xff0c;但是下载瓦片软件没有linux版本&#xff0c;于是想到共享文件夹 问题描述 按照这个大佬文档(linuxsamba配置)一切都还好&#xff0c;查…

springboot 注解属性转换字典

1.注解相关功能实现 定义属性注解 import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.vehicle.manager.core.serializer.DicSerializer;import java.lang.annotation.*;/*** a…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(十一)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

家庭游泳池:阳台上可安装的泳池

游泳池可根据场地大小选择安装在室内或室外&#xff0c;这种的泳池规格尺寸相对来说较大&#xff0c;较适合于大型体育场馆、小区配套、健身房等场所。这款家庭泳池与之前的不太一样&#xff0c;不论是从池体材料还是装饰面层都有着很大的差异。 该家庭泳池规格尺寸比较固定&a…

书籍推荐|《使用 ESP32 开发物联网项目(第二版)》

随着物联网技术的迅猛发展&#xff0c;ESP32 因其强大的功能而备受物联网开发者的青睐。在此背景下&#xff0c;资深物联网专家 Vedat Ozan Oner 撰写的《使用 ESP32 开发物联网项目&#xff08;第二版&#xff09;》&#xff0c;为开发者提供了全面且深入的指南读物。 资深物…

SpringBoot整合rabbitmq-直连队列,没有交换机(一)

说明&#xff1a;本文章只是springboot和rabbitmq的直连整合&#xff0c;只使用队列生产和消费消息&#xff0c;最简单整合&#xff01; 工程图&#xff1a; A.总体pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://…

【精选】Java项目介绍和界面搭建——拼图小游戏 上

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

实施顾问的 IDoc 基础知识

目录 一、前言二、概览三、EDI 标准和 IDOC四、IDOC 术语4.1 IDOC&#xff08;基本&#xff09;类型4.2 IDOC 扩展&#xff08;EXTENSION&#xff09;4.3 IDoc 段4.4 父项 IDoc 段与子项 IDoc 段4.5 入站/出站 IDOC4.6 IDOC方向4.7 合作伙伴4.8 合作伙伴类型4.9 消息类型4.10 流…

在Ubuntu中安装Anaconda和创建虚拟环境(保姆级教学,值得借鉴与信任)

一、下载linux版本的Anaconda 1.方法一&#xff1a;官网下载 https://www.anaconda.com/download#downloads2.方法二&#xff1a;在清华大学开源软件镜像站里下载 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/最后选择了Anaconda3-2022.10-Linux-x86_64.sh进行下…

【EFK】基于K8S构建EFK+logstash+kafka日志平台

基于K8S构建EFKlogstashkafka日志平台 一、常见日志收集方案1.1、EFK1.2、ELK Stack1.3、ELK filbeat1.4、其他方案 二、EFK组件介绍2.1、Elasticsearch组件2.2、Filebeat组件【1】 Filebeat和beat关系【2】Filebeat是什么【3】Filebeat工作原理【4】传输方案 2.3、Logstash组件…

python 中常用的热门库介绍

阅读本文之前请参阅-----如何系统的自学python Python 是一种非常流行的编程语言&#xff0c;它的一个主要优势是拥有一个庞大的生态系统&#xff0c;其中包括许多强大的库。这些库为各种任务提供了解决方案&#xff0c;从数据分析到机器学习&#xff0c;从网络爬虫到图像处理。…

ArmSoM Rockchip系列产品 通用教程 之 CAN 使用

CAN 使用 1. CAN 简介 CAN (controller Area Network)&#xff1a;控制器局域网络总线&#xff0c;是一种有效支持分布式控制或实时控制的串行通信网络。 目前世界上绝大多数汽车制造厂商都采用CAN总线来实现汽车内部控制系统之间的数据通信。 RK3568/RK3588的CAN驱动文件&a…

推荐一款ssh工具 xshell替代品 electerm

下载地址 electerm&#xff1a; https://electerm.github.io/electerm/ windows版本 产品优势 复制粘贴&#xff0c;可以直接使用ctrlc/v 非常的方便 而且不想xshell 需要账号登陆&#xff0c;有更新弹窗&#xff0c;自身集成了sftp 界面设计更新&#xff0c;比MobaXterm的…