C++模版初阶----函数模版、类模版

news2024/12/23 7:44:34

C++模版初阶

  • 1. 泛型编程
  • 2. 函数模板
    • 2.1 函数模板概念
    • 2.2函数模板格式
    • 2.3 函数模板的原理
    • 2.4 函数模板的实例化
    • 2.5 函数模版的匹配原则
  • 3. 类模板
    • 3.1 类模板的定义格式
    • 3.2 类模板的实例化
  • 总结

1. 泛型编程

泛型编程 : 编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础

  1. template 模版关键字
  2. template< class T>
  3. template< typename T>
  • 模版参数传递的是类型;函数参数传递的是对象值。
  • 模版的定义和声明不支持分别在两个文件里面【会出现链接错误,所有的链接错误都是符号表找不到】因为编译器的模版T是无法确定的,无法生成符号表。
  • 模版是不支持声明与定义分别放到.h和.cpp中,一般都是需要放到一个文件中。有些地方就会命名成.hpp【头文件和定义实现内容合并到一起】但是并不是必须是.hpp,.h也是可以的。

2. 函数模板

2.1 函数模板概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

2.2函数模板格式

template<typename T1, typename T2,…,typename Tn> 返回值类型 函数名(参数列表){}

template<typename T>
void Swap( T& left,  T& right)
{
    T temp = left;
    left = right;
    right = temp;
}

注意:注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

2.3 函数模板的原理

在这里插入图片描述

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供 调用。

比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码, 对于字符类型也是如此

2.4 函数模板的实例化

  1. 隐式实例化:让编译器根据实参推演模板参数的实际类型
  2. 显式实例化:在函数名后的<>中指定模板参数的实际类型
int main(void)
{
    int a = 10;
    double b = 20.0;
	// 显式实例化 
	Add<int>(a, b); 
	return 0;
}

2.5 函数模版的匹配原则

1.一个非模板函数【专门的函数】可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。
2.对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。
3.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

3. 类模板

3.1 类模板的定义格式

template<class T1, class T2, ..., class Tn> 
class 类模板名
{
	// 类内成员定义 
};
template<class T>
class Stack
{
public:
	Stack(size_t capacity = 4)
	{
		_array = new T[capacity];
		_capacity = capacity;
		_size = 0;
		cout << "Stack(size_t capacity = 4)" << endl;
	}

	~Stack()
	{
		delete[] _array;
		_capacity = 0;
		_size = 0;
	}

	void push(const T& data);
private:
	T* _array;
	int _capacity;
	int _size;
};

//声明和定义分离的写法 不建议分离到.h 和.cpp
template<class T>
void Stack<T>::push(const T& data)
{
	_array[_size++] = data;
}

3.2 类模板的实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<> 中即可。类模板名字不是真正的类,而实例化的结果才是真正的类。

	// Vector类名,Vector<int>才是类型 
	Vector<int> s1;
	Vector<double> s2;

总结

以上就是今天要讲的内容,本文详细的介绍了函数模版和类模板。希望给各位程序猿们带来帮助!

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

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

相关文章

模电期末复习(三)放大电路的频率响应

放大电路的频率响应 3.1 频率响应的一般概念3.1.1 幅频特性和相频特性3.1.2 下限频率、上限频率和通频带3.1.3 频率失真3.1.4 波特图3.1.5高通电路和低通电路 3.2 三极管的频率参数3.2.1 共射截止频率3.2.2 特征频率3.2.3 共基截止频率 3.3 单管共射放大电路的频率响应3.3.1 三…

Chrome 侧边栏开发示例

前言 最近做项目&#xff0c;需要开发浏览器扩展&#xff0c;但是考虑页面布局兼容性问题&#xff0c;使用了Chrome114开始的侧边栏&#xff0c;浏览器自带的能力毕竟不会出现兼容性问题&#xff0c;不过Chrome123开始&#xff0c;侧边栏居然又可以选择固定右侧扩展栏了&#…

IDEA中Vue开发环境搭建

1. IDEA安装Vue.js 文件>设置>插件>搜索Vue.js并安装。 2. 安装Node.js 官网地址&#xff1a;https://nodejs.org 安装包下载地址&#xff1a;https://nodejs.org/en/download 下载并安装&#xff0c;安装时&#xff0c;勾选添加系统变量选项。 # 如果正确安装…

Spring AI Summary

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Spring AI is a project that aims to streamline the development of AI applications by providing abstractions and reusable components that can be easily integrate…

Jmeter-非GUI模式下运行jmeter脚本-适用于服务器上持续集成测试

背景 大部分Jmeter脚本都是部署在Linux上运行&#xff0c;利用Jenkins做接口自动化&#xff0c;定时巡检任务。 执行命令 1.进入jmeter的目录&#xff0c;bin文件夹 cd C:\path\to\jmeter\bin2.运行脚本文件 jmeter -n -t D:\{脚本文件目录}\xxx.jmx -l D:\{脚本文件目录}…

Java代码基础算法练习-逆序输出-2024.04.22

任务描述&#xff1a; 输入10个数字&#xff08;数字取值范围&#xff1a;0~1000&#xff09;&#xff0c;然后逆序输出。 任务要求&#xff1a; 代码示例&#xff1a; package April_2024;import java.util.Scanner;/*** 输入10个数字&#xff08;限定在0~1000范围内&#x…

Rust基本数据类型-切片

一、切片是什么&#xff0c;怎么用 1、切片是什么 切片并不是 Rust 独有的概念&#xff0c;在 Go 语言中就非常流行&#xff0c;它允许你引用集合中部分连续的元素序列&#xff0c;而不是引用整个集合。 对于字符串而言&#xff0c;切片就是对 String 类型中某一部分的引用&…

FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器

AVS3是中国AVS工作组制定的第三代音视频编解码技术标准&#xff0c;也是全球首个已推出的面向8K及5G产业应用的视频编码标准。AVS工作组于2019年3月9日完成第三代AVS视频标准&#xff08;AVS3&#xff09;基准档次的制订工作&#xff0c;参考软件的测试表明&#xff0c;AVS3基准…

webpack-babel2

浏览器的兼容性问题 浏览器的兼容性问题不知包括随屏幕大小而变化&#xff0c;还包括针对浏览器支持的特性&#xff08;如css特性&#xff0c;js特性&#xff09; 做处理。 目前市场上有很多浏览器&#xff1a;Chrome,Safari,IE,Edge等&#xff0c;要根据它们的市场占有率来决…

将城市名称替换成简写

图片左边是城市全称&#xff0c;右边是城市简写。 现在有一句话“this is Republic of Korea,that is United States of America”&#xff0c;要将其中的城市全称替换成城市简写。 #"Republic of Korea"替换成 South Korea s"this is Republic of Korea,that …

三、Flask模型基础

ORM 创建模型 # exts.py&#xff1a;插件管理 # 扩展的第三方插件 # 1.导入第三方插件 from flask_sqlalchemy import SQLAlchemy # ORM插件 from flask_migrate import Migrate # 2. 初始化 db SQLAlchemy() # ORM migrate Migrate() # 数据迁移 # 3. 和app对象绑定 def…

生态短讯 | Tapdata 与 TDengine 完成产品兼容性互认证,打造物联网实时数据生态

近月&#xff0c;深圳钛铂数据有限公司&#xff08;以下简称钛铂数据&#xff09;自主研发的实时数据平台&#xff08;Tapdata Live Data Platform&#xff09;与北京涛思数据科技有限公司&#xff08;以下简称涛思数据&#xff09;自主研发的大数据平台 TDengine&#xff0c;已…

SpringBoot集成Sleuth

引入Maven依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency> 配置yml文件 bootstrap.yml文件增加如下配置 注&#xff1a;这个配置不是必须要&#…

WordPress SQLite Docker 镜像封装细节

为了让大家用的放心&#xff0c;同时解答 GitHub 社区中的疑问。这篇文章聊聊上一篇文章的 Docker 容器封装细节。 写在前面 在前一篇文章《WordPress 告别 MySQL&#xff1a;Docker SQLite WordPress》中&#xff0c;如果你跟着文章实践&#xff0c;大概三分钟就能够启动一个…

(三)组合特征与特征变换 学习简要笔记 #机器学习特征工程 #CDA学习打卡

目录 一. 统计及组合特征 1&#xff09;统计特征 2&#xff09;业务特征 3&#xff09;组合特征 &#xff08;a&#xff09;简单组合特征 &#xff08;b&#xff09;模型特征组合 二. 特征变换 1&#xff09;对数变换&#xff08;Logarithmic Transformation&#xff0…

KingbaseES存储过程的用法

数据库版本&#xff1a;KingbaseES V008R006C008B0014 简介 存储过程是一种强大的数据库编程工具&#xff0c;可以帮助开发人员实现复杂的业务逻辑和数据操作&#xff0c;用于提高数据库的性能、安全性和可维护性。 存储过程一般是将业务逻辑和数据操作封装起来&#xff0c;以便…

深度学习之图像分割从入门到精通——基于unet++实现细胞分割

模型 import torch from torch import nn__all__ [UNet, NestedUNet]class VGGBlock(nn.Module):def __init__(self, in_channels, middle_channels, out_channels):super().__init__()self.relu nn.ReLU(inplaceTrue)self.conv1 nn.Conv2d(in_channels, middle_channels, …

Redis底层数据结构之SDS

目录 一、概述二、SDS结构三、为什么使用SDS 下一篇 redis底层数据结构之ziplist 一、概述 Redis 中的 SDS&#xff08;Simple Dynamic String&#xff0c;简单动态字符串&#xff09;是 Redis 用于存储字符串值的底层实现&#xff0c;是对 C 语言传统字符串&#xff08;以 nu…

如何使用 Node.js 发送电子邮件全解和相关工具推荐

大多数Web应用程序都需要发送电子邮件。它可能用于注册、密码重置、状态报告&#xff0c;甚至是完整的市场营销活动&#xff0c;如新闻和促销。本教程解释了如何在Node.js中发送电子邮件&#xff0c;但其概念和挑战适用于您正在使用的任何系统。 你会在 npm 上找到大量与电子邮…

深度图转点云

一、理论分析 二、其他分析 1、相机内参 相机内参主要是四个参数fx,fy,u0,v0。要明白相机内参就是相机内部参数&#xff0c;是参考像素坐标系而言&#xff0c;有了这个前提&#xff0c;这四个参数也就很好理解了。 &#xff08;1&#xff09;首先&#xff0c;。其中F是相机的…