C++模版初阶

这篇具有很好参考价值的文章主要介绍了C++模版初阶。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++模版初阶,C++,c++,开发语言,笔记,深度学习,数据结构,算法

泛型编程

如下的交换函数中,它们只有类型的不同,应该怎么实现一个通用的交换函数呢?

void Swap(int& left, int& right)
{
    int temp = left;
    left = right;
    right = temp;
}

void Swap(double& left, double& right)
{
    double temp = left;
    left = right;
    right = temp;
}

void Swap(char& left, char& right)
{
    char temp = left;
    left = right;
    right = temp;
}

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

那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢? 

C++模版初阶,C++,c++,开发语言,笔记,深度学习,数据结构,算法C++模版初阶,C++,c++,开发语言,笔记,深度学习,数据结构,算法

        如果在C++中,也能够存在这样一个模具,通过给这个模具中更换不同的字体(类型),来获得不同的模版(即生成具体类型的代码),那将会节省许多头发和时间。巧的是前人早已将树栽好,我们只需在此乘凉。有了如上图的思想,我们也可以创建这样的一个模版!就有了泛型编程。
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

模版分为:

函数模版:

函数模版概念:

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

函数模板格式:

格式:template<typename Type>
           template<class Type>

C++模版初阶,C++,c++,开发语言,笔记,深度学习,数据结构,算法

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

函数模版原理:

        函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。

C++模版初阶,C++,c++,开发语言,笔记,深度学习,数据结构,算法

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

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

函数模版实例化: 

        用不同类型的参数使用函数模板时,称为函数模板的实例化。

        模板参数实例化分为:隐式实例化和显式实例化。

隐式实例化: 让编译器根据实参推演模板参数的实际类型

C++模版初阶,C++,c++,开发语言,笔记,深度学习,数据结构,算法

 显式实例化:在函数名后的<>中指定模板参数的实际类型

C++模版初阶,C++,c++,开发语言,笔记,深度学习,数据结构,算法

模版参数的匹配原则:

1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数;
2. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板;

3.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。

 可以理解为:

C++模版初阶,C++,c++,开发语言,笔记,深度学习,数据结构,算法

类模版

类模版的定义格式:

template<class T1, class T2, ..., class Tn>
class 类模板名
{
        // 类内成员定义
};

C++模版初阶,C++,c++,开发语言,笔记,深度学习,数据结构,算法

 类模版实例化:

#include <iostream>
using namespace std;

template<class T>
class Stack
{
public:
	Stack(int n = 4);

	~Stack()
	{
		cout << "~Stack()" << endl;

		delete[] _a;
		_a = nullptr;
		_top = _capacity = 0;
	}

	void Push(const T& x)
	{
		//...
	}

private:
	T* _a;
	int _top;
	int _capacity;
};

//类模版不能将定义和声明在不同的文件
//类外定义
template<class T>
Stack<T>::Stack(int n)
{
	cout << "Stack(int n = 4)" << endl;

	_a = new T[n];
	_top = 0;
	_capacity = n;
}

int main()
{
	//在普通的类中:类名就是类型
	//在类模版实例化的类中:类名不是类型,类名<数据类型>才是类型
	Stack<int> st1;//显示实例化
	Stack<double> st2;

	//显示实例化的类型不同,它们就是不同的类
	//st1 = st2;//一个是Stack<int>  一个是Stack<double>

	return 0;
}

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

以上就是个人学习的见解和学习过程的解析,欢迎各位大佬在评论区探讨,交流!
如果本篇对你有帮助的话,三连支持一下吧。
感谢大佬们的三连! 感谢大佬们的三连! 感谢大佬们的三连!

                                              C++模版初阶,C++,c++,开发语言,笔记,深度学习,数据结构,算法文章来源地址https://www.toymoban.com/news/detail-755382.html

到了这里,关于C++模版初阶的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++模版初阶讲解

    今日为大家分享C++的模版,这里先把模版的初阶讲解一下,以后再讲解模版进阶! 在我们进行学习的编程中,常常会有许多函数的功能相同,有些不同点可能就是其中的数据类型不同!如果我们统统进行函数重载的话,其实也能解决问题,例如,实现两个数的交换! 但是函

    2024年02月06日
    浏览(38)
  • 【c++】初阶模版与STL简单介绍

    🔥个人主页 : Quitecoder 🔥 专栏 : c++笔记仓 朋友们大家好,本篇文章介绍一下模版和对STL进行简单的介绍,后续我们进入对STL的学习! 泛型编程是一种编程范式,它强调的是在编写代码时能够使得算法、数据结构或函数能够对各种数据类型都能工作,而 无需因数据类型的

    2024年04月09日
    浏览(47)
  • C语言初阶学习笔记

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.复杂概念  1.1大小端 1.2 整形提升 1.2.1整形提升的意义: 1.2.2整形提升规则 1.2.3实例 2.特定功能 3.栈区内存销

    2024年02月10日
    浏览(29)
  • 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    图的遍历指从图中某一顶点出发(任意一个顶点都可以作为访问的起始顶点),按照某种遍历方法,对图中所有的顶点访问一次且只访问一次。图与树不一样,其中一个顶点可能与多个顶点相连,所以需记录已访问过的顶点,当访问一个顶点后,考虑如何选取下一个要访问的

    2024年02月05日
    浏览(50)
  • 【学习笔记】数据结构算法文档(类C语言)

    1.1.1 线性表的顺序存储表示 1.1.2 顺序表中基本操作的实现 1.1.2.1 初始化 1.1.2.2 取值 1.1.2.3 查找 1.1.2.4 插入 1.1.2.5 删除 1.1.2.6 计数 1.2.1 单链表的定义和表示 ★ 关于结点 1.2.2 单链表基本操作的实现 1.2.2.1 初始化 1.2.2.2 取值 1.2.2.3 查找 1.2.2.4 插入 1.2.2.5 删除 1.2.2.6 前插法创建单

    2024年02月07日
    浏览(42)
  • 机器学习笔记 - 基于C++的​​深度学习 一、向量运算

            由于它们的可扩展性和灵活性,现在很少找到不使用TensorFlow、PyTorch、Paddle......(这里的省略号是指各种成熟的深度学习库)的项目。          花时间从头开始编写机器学习算法(即在没有任何基础框架的情况下)似乎有些重复造轮子的感觉。然而,事实并非

    2024年02月13日
    浏览(39)
  • 机器学习笔记 - 基于C++的​​深度学习 三、实现成本函数

            作为人工智能工程师,我们通常将每个任务或问题定义为一个函数。         例如,如果我们正在开发面部识别系统,我们的第一步是将问题定义为将输入图像映射到标识符的函数F( X )。但是 问题是如何知道 F(X) 公式?         事实上,使用公式或一系列

    2024年02月13日
    浏览(35)
  • 【数据结构初阶】之堆(C语言实现)

    前言 :在二叉树基础篇我们提到了二叉树的顺序实现,今天让我们来学习一下特殊的二叉树———堆的相关知识。 📃 博客主页: 小镇敲码人 💞 热门专栏:数据结构与算法 🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月

    2024年04月09日
    浏览(80)
  • 『初阶数据结构 • C语言』④ - 冒泡排序

      本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。      本章内容 写在前面 1.冒泡排序 2.冒泡排序实战 3.冒泡排序的实现 4.冒泡排序的效率 5.二次问题 6.线性解决 7.总结     大 O记法能客观地衡量

    2024年02月16日
    浏览(44)
  • 『初阶数据结构 • C语言』⑤ - 选择排序

    本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。     目录 写在前面 1.选择排序 2.选择排序实战 3.选择排序的实现 4.选择排序的效率 5.忽略常数 6.大O的作用 7.总结     大 O 是一种能够比较算法效

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包