当前位置: 首页 > article >正文

C++初阶 | [六] 模板初阶

摘要:泛型编程,函数模板,类模板

使用函数重载虽然可以实现,但是有一下几个不好的地方:

  1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数;
  2. 代码的可维护性比较低,一个出错可能所有的重载均出错。

告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码。——模板

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


1. 函数模板

#include<iostream>

template<class T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int v1 = 1, v2 = 2;
	Swap(v1, v2);
	std::cout << v1 << " " << v2 << std::endl;

	double d1 = 1.1, d2 = 2.2;
	Swap(d1, d2);
	std::cout << d1 << " " << d2 << std::endl;

	return 0;
}

 注意:模板参数类型不匹配的问题,如下

  • 问题描述:上述代码中,如果 Swap 函数的类型匹配,如 Swap( 1 , 1.3 ) ——参数类型分别为 int , double 类型不匹配编译器会报错
  • 解决方式:①强制类型转换 e.g.Swap( 1 , (int)1.3 );②显式调用 e.g.Swap<int>( 1 , 1.3 )

函数模板调用原则:调用最匹配的,同时,如果有现成的优先用现成的(就是已经被实例化显式的函数)

显式实例化可以强制调用function_name<Type>(parameters)


2. 类模板

当我们创建一个类,这个类中需要存储不同的数据类型,例如:

同函数模板,类模板也是起到一个模板的作用,编译通过模板来进行实例化,实例化出不同的类,根据显式实例化调用来匹配。 

成员函数声明和定义分离的问题

template<class T>
class MyStack
{
public:
	void Test();//函数声明
private:
	T* _a;
	size_t _top;
	size_t _capacity;
};

template<class T>
void MyStack<T>::Test()
{
	//函数定义
}

 如上述代码,若声明与定义分离,定义时需指明类域类模板中 classname<T> 才是类型 (Type),普通类中 classname 即为类型(Type)。类型即为域名!同时,template<class T> 也需要单独声明。

注:类模板 声明和定义 分离在 不同的文件中,会出现链接失败,不建议声明和定义分离。


END


http://www.kler.cn/a/144428.html

相关文章:

  • 02 _ 架构分层:我们为什么一定要这么做?
  • idea git将某个分支内的commit合并到其他分支
  • 汽车电子 -- 车载ADAS
  • macos安装小软件 cmake
  • 6 个有效且可用的顶级 Android 数据恢复工具
  • 【深度学习】P1 数据缺失值预处理
  • 【Linux】Linux权限管理
  • 最新AI创作系统ChatGPT系统运营源码,支持GPT-4图片对话能力,上传图片并识图理解对话,支持DALL-E3文生图
  • 深度学习+不良身体姿势检测+警报系统+代码+部署(姿态识别矫正系统)
  • 【分布式】分布式事务及其解决方案
  • JAVA 面向对象编程
  • Vue中项目进行文件压缩与解压缩 (接口返回文件的url压缩包前端解析并展示出来,保存的时候在压缩后放到接口入参进行保存)
  • C语言 移位操作符
  • 间接法加窗分析信号的功率谱
  • 【程序员的自我修养01】编译流程概述
  • 【Web】CmsEasy 漏洞复现
  • 彩纸屋在线少儿编程源码/scratch在线编程系统/培训管理系统源码/在线培训系统源码PHP
  • Leetcode—55.跳跃游戏【中等】
  • 防止应用程序截屏(容器式,防止极域电子教室和录屏软件录制)
  • LVS+Keepalived 高可用群集