[C++提高编程](二):模板--类模板

目录

类模板语法

类模板与函数模板的区别

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

类模板对象做函数参数

类模板与继承

类模板成员函数类外实现

类模板份文件编写

类模板与友元

类模板使用示例


类模板的作用

        建立一个通用类,类中的成员,数据类型可以不具体制定,用一个虚拟类型来代表

类模板语法

template<typename T>
类

类模板与函数模板的区别

  • 类模板没有自动类型推导的使用方式
  • 类模板在模板参数列表中可以有默认参数

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

  • 普通类中的成员函数一开始声明就可以创建
  • 类模板中的成员函数在调用时才创建

类模板对象做函数参数

  1. 指定传入的类型-----直接显示对象的数据类型(广泛使用)

  2. 参数模板化-----将对象中的参数变为模板进行传递

  3. 整个类模板化-----将这个对象类型模板化进行传递

类模板与继承

  • 当子类继承的父类是一个类模板时,子类在声明的时候要指定出父类中T的类型
  • 如果不指定,编译器无法给子类分配内存
  • 如果想灵活指定出父类中T的类型,子类也需要变为类模板
#include <iostream>
#include <string>using namespace std;template <class T>
class Base
{
public:T m;
};//继承,父类为类模板, 1.指定类型
class Son1 :public Base<int>
{};
//继承,父类为类模板, 2.灵活继承
template<class S1, class NameType>
class Son2 :public Base<NameType>
{
public:S1 m_obj;Son2(S1 obj, NameType name){this->m_obj = obj;this->m = name;}void show_info(){cout << "son m_obj:" << this->m_obj << endl;cout << "son m:" << this->m << endl;}
};void test_Son(void)
{Son2<string, int> m_son("son", 12);m_son.show_info();
}int main()
{test_Son();return 0;
}

类模板成员函数类外实现

        类模板中成员函数类外实现时,需要加上模板参数列表

#include <iostream>
#include <string>using namespace std;template<class NameType, class AgeType>  //默认参数
class Person
{
public:Person(NameType name, AgeType age);void show_Info();NameType m_Name;AgeType m_Age;
};//类外实现构造函数
template<class NameType, class AgeType>
Person<NameType, AgeType>::Person(NameType name, AgeType age)
{this->m_Name = name;this->m_Age = age;
}//类外实现成员函数
template<class NameType, class AgeType>
void Person<NameType, AgeType>::show_Info()
{cout << "姓名:" << this->m_Name << ",年龄:" << this->m_Age << endl;
}void test(void)
{Person<string, int> person("张三", 19); //必须显示指定类型person.show_Info();
}int main()
{test();return 0;
}

类模板份文件编写

问题:类模板中成员函数创建时机在调试阶段,导致份文件编写时链接不到。

解决方案:

  • 1.直接包含.cpp源文件
//修改头文件#include "person.h"改为
#include "person.hpp"
  • 2.将声明和实现写到同一个文件中,并修改后缀名为.hpp, hpp是约定名称,非强制。
//声明和实现写一起命名为.hpp文件,然后包含hpp文件
#include "person.hpp"

类模板与友元

  • 全局函数类内实现---直接在类内声明友元即可(建议使用)
  • 全局函数类外实现---需要提前让编译器知道全局函数的存在
#include <iostream>
#include <string>
using namespace std;//提前让编译器知道Person存在
template<class NameType, class AgeType> class Person;//全局函数类外实现
template<class NameType, class AgeType>
void show_Info1(Person<NameType, AgeType>p)
{cout << "姓名:" << p.m_Name << ",年龄:" << p.m_Age << endl;
}template<class NameType, class AgeType>  //默认参数
class Person
{
public:Person(NameType name, AgeType age);//全局函数配合友元类内实现friend void show_Info(Person<NameType, AgeType>p){cout << "姓名:" << p.m_Name << ",年龄:" << p.m_Age << endl;}//全局函数类外实现  ;加空模板参数列表 ;编译器提前知道这个函数的存在friend void show_Info1<>(Person<NameType, AgeType>p);
private:NameType m_Name;AgeType m_Age;
};template<class NameType, class AgeType>
Person<NameType, AgeType>::Person(NameType name, AgeType age)
{this->m_Name = name;this->m_Age = age;
}void test(void)
{Person<string, int> person("张三", 19); //必须显示指定类型show_Info(person);show_Info1(person);
}int main()
{test();return 0;
}

类模板使用示例

#include <iostream>
#include <string>using namespace std;template<class NameType, class AgeType = int>  //默认参数
class Person
{
public:Person(NameType name, AgeType age){this->m_Name = name;this->m_Age = age;}void show_Info(){cout << "姓名:" << this->m_Name << ",年龄:" << this->m_Age << endl;}NameType m_Name;AgeType m_Age;
};void test(void)
{Person<string, int> person("张三", 19); //必须显示指定类型Person<string> person_1("李四", 19);person.show_Info();person_1.show_Info();
}
//指定传入类型
void printPerson(Person<string, int> &person)
{person.show_Info();
}
//将参数模板化
template<class NameType, class AgeType>
void printPerson1(Person<NameType, AgeType>& person)
{person.show_Info();cout << "NameType数据类型为:" << typeid(NameType).name() << endl;cout << "AgeType数据类型为:" << typeid(AgeType).name() << endl;
} //整个类模板化
template<class T>
void printPerson1(T & person)
{person.show_Info();cout << "T数据类型为:" << typeid(T).name() << endl;
}void test_parm(void)
{//指定传入类型Person<string, int> person("张三", 199);printPerson(person);//将参数模板化printPerson1(person);//整个类模板化printPerson1(person);
}int main()
{test();test_parm();return 0;
}

推荐文章:[C++提高编程](一):模板----函数模板

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

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

相关文章

在Linux系统安装MySQL步骤

准备工作&#xff1a;下载好mysql&#xff08;Mariadb&#xff09;安装包&#xff1a; 第一步&#xff1a;检查系统中是否有自带的MySQL&#xff08;Mariadb&#xff09;&#xff1b; # 下面这两个都执行一下 [rootcentos101 opt]# rpm -qa | grep mysql [rootcentos101 opt]#…

大数据面试题 —— Flume

目录 介绍 FlumeFlume 架构请说一下你提到的几种 source 的不同点Flume 传输数据时如何保证数据一致性TailDir 为什么可以断点重传说下Flume事务机制Sink 消费能力弱&#xff0c;Channel 会不会丢失数据数千个Flume要怎么统一配置&#xff0c;修改就分发吗Flume一个节点宕机了怎…

用 二层口 实现三层口 IP 通信的一个实现方法

我们一般用 undo portswitch 来将二层口转为三层口&#xff0c;但如果设备不支持的话&#xff0c;那么。。。 一、拓朴图&#xff1a; 二、实现方法&#xff1a; 起一个 vlan x&#xff0c;配置 vlanif地址&#xff0c;然后二层口划分到 vlan x 下&#xff0c;对端做同样的配置…

HTTP响应头和请求头信息对照表

HTTP请求头提供了关于请求&#xff0c;响应或者其他的发送实体的信息。HTTP的头信息包括通用头、请求头、响应头和实体头四个部分。每个头域由一个域名&#xff0c;冒号&#xff08;:&#xff09;和域值三部分组成。 通用头标&#xff1a;即可用于请求&#xff0c;也可用于响应…

一、MySQL基础学习

目录 1、MySQL启动2、MySQL客户端连接3、SQL3.1、SQL语句分类3.2、DDL&#xff08;数据库定义语言&#xff09;3.2.1、操作数据库3.2.2、操作数据表 3.3、DML&#xff08;数据库操作语言&#xff09;3.3.1、增加 insert into3.3.2、删除 delete3.3.3、修改 update 3.4、DQL&…

linux 日志排查

文章目录 前言一、1、问题排查二、清理脚本1.代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介…

用python模拟天体运动(二体运动与天体轨道稳定问题)

目录 1. 模拟天体运动的代码 2. 运行效果 3. 非平方反比(轨道稳定性问题) 1. 模拟天体运动的代码 接下来我们将用python模拟实现天体运动 以下是我们所需要的库&#xff1a; import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy …

Java安装及环境配置详细教程

1.1 下载 Java 安装包 官网下载链接[点击跳转] 建议下载202版本&#xff0c;因为202版本之后的 Oracle JDK 是商用收费的&#xff08;个人使用不收费&#xff09; 1.2 勾选红框中内容&#xff0c;然后点击下方下载 1.3 如果没有登录 Oracle 则会跳转到该页面&#xff0c;因为…

使用多元线性回归简单预测

模型和代码 数据格式如下&#xff1a;前21列作为模型输入X&#xff0c;最后5列作为模型输出Y。 训练集&#xff1a; 测试集&#xff1a; 代码&#xff1a; from numpy import genfromtxt import numpy as np from sklearn.ensemble import GradientBoostingRegressor from …

解锁编程潜能:ChatGPT如何革新软件开发

目录 一、背景 二、功能描述 三、总结 一、背景 在这个飞速发展的数字时代&#xff0c;软件开发的效率和质量成了衡量一个开发者能力的重要标准。随着人工智能技术的不断进步&#xff0c;越来越多的开发者开始寻找能够提升工作效率的新方法。我就是其中之一&#xff0c;最近…

蓝桥杯刷题(十一)

1.卡片 反向思考&#xff0c;看k种卡片可以分给几位同学 代码 n int(input()) k 1 while k*(k1)<2*n:k1 print(k)2.美丽的2 代码 def f(x)->bool:while x:if x%102:return Truex//10return False cnt 0 for i in range(1,2021):if f(i):cnt1 print(cnt)3.单词分析 …

vue3+vite项目打包遇到的问题

一、项目打包出现空白页 vite.config.js中&#xff0c;添加base: ./ import { defineConfig } from vite import vue from vitejs/plugin-vueexport default defineConfig({base: ./, })router/index.js&#xff0c;将路由模式改成hash模式 import { createRouter, createWe…

前端开发使用 Vue 3 + TypeScript + Pinia + Element Plus + ECharts

简介 本文档旨在介绍使用 Vue 3 结合 TypeScript、Pinia 状态管理、Element Plus UI 组件库以及 ECharts 图表库进行前端开发的技术细节和最佳实践。 技术栈概述 Vue 3: 一款流行的 JavaScript 框架&#xff0c;提供了响应式和组件化的开发方式&#xff0c;使得构建用户界面更…

【c++】string类---标准库(STL)中的string类

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.STL(标准库) 1.1 什么是STL 1.2 STL的版本 1.3 STL的六大组件 1.4 STL的重要性 1.5 如何学习STL 6.STL的缺陷 2. 为什么要学习st…

C++有关内存的那些事

个人主页&#xff1a;PingdiGuo_guo 收录转栏&#xff1a;C干货专栏 前言 本篇博客是讲解关于C内存的一些知识点的。 文章目录 前言 1.内存函数 1.1memcpy函数 1.2memmove函数 1.3 memset函数 2.各数据类型占用 2.1bool类型 2.2char类型 2.3short、int、long类型及整数…

SegFormer 项目排坑记录

SegFormer 项目排坑记录 任务记录创建conda环境 准备数据库和预训练参数程序配置修改测试可视化训练 任务 需要复现SegFormer分割项目&#xff0c;似乎还有点麻烦&#xff0c;参考这几个进行复现&#xff0c;记录下过程&#xff1a; SegFormer mmsegmentation CSDN博客 知乎博…

Docker 安装 Nginx 容器部署前端项目

先安装docker Docker安装详情 安装Nginx镜像 1、拉去取Nginx镜像 Nginx官方镜像 docker pull nginx 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest ) docker pull nginx:xxx 下载指定版本的Nginx镜像 (xxx指具体版本号)我们拉去1.24.0的nginx镜像 …

C语言计算天数

输入y和m两个整数&#xff0c;y表示年份&#xff0c;m表示月份&#xff0c;计算y年m月有多少天&#xff0c;并输出天数。 思路:已知无论年份变化1,3,5,7,8,10,12月是31天,4,6,9,11是30天.而二月份根据闰年平年判断. 1.使用一个数组,来表示1-12月份的天数,2月份默认为28天 2.…

视频号视频下载需要小程序提供下载支持!

前言&#xff1a;和大家分享一个视频号视频下载的方法&#xff01;可以帮助用户使用的工具将视频号视频保存到手机相册的&#xff01; 有时候在刷视频号的时候碰到自己喜欢的视频就情不自禁的想要把他下载下来&#xff0c; 1&#xff1a;遇到喜欢的视频视频怎么下载 例如&am…

通过https请求可以返回哪些数据(精简版)

2024年3月18日&#xff0c;周一下午 HTTPS 请求还可以返回各种其他类型的数据。一些常见的返回数据类型包括&#xff1a; 文本数据&#xff1a;服务器可以返回纯文本数据&#xff0c;例如 HTML、XML、CSS 等。二进制数据&#xff1a;服务器可以返回图片、视频、音频等二进制数…