【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶)

这篇具有很好参考价值的文章主要介绍了【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶)

 一.泛型编程

引入

我们之前都写过交换函数Swap,例如这样的:

//交换两个整型
void Swap(int*x1, int *x2)
{
	int tmp = *x1;
	*x1 = *x2;
	*x2 = tmp;

}

如果要交换其它的类型该怎么办呢?

那只能当个CV工程师了,然后再修修改改,但是如果有很多类型呢?后期又需要改动该怎么办呢?一个一个函数的改吗?多个功能相同的函数,又会使程序可读性降低,代码冗余

我们能用一个具有交换函数逻辑的模具,来实现不同需求吗?

答案是可以,用模板就可以了。

模板

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

语法:template<class/typename  参数,class/typename  参数 .......>

注意:class 或是  typename  是用来定义模板参数的关键字,不可以使用  struct,并且可             以定义多个模板参数

模板分为两种:

  1.函数模板

  2.类模板

注意:类模板和模板类不是同一个概念(详见下文)

示例:Swap模板

template<typename T>   //这个模板的作用域是下面的一个大括号,当然也可以有多个模板参数
void Swap(T& x1, T& x2)  //注意这里要用引用
{
	T tmp = x1;
	x1 = x2;
	x2 = tmp;
}

【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶)

 文章来源地址https://www.toymoban.com/news/detail-458612.html


二.函数模板

概念

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

编译器由模板生成函数的过程称为实例化

上文中的Swap模板就是一个函数模板。

隐式实例化

隐式实例化是指编译器根据实参自己推演参数的类型,并生成对应的函数;

以Swap函数模板为例:

template<typename T>
void Swap(T &x1, T &x2)
{
	T tmp = x1;
	x1 = x2;
	x2 = tmp;
}

int main()
{
	int a1 = 1, a2 = 2;
	double b1= 5.2, b2 = 6.4;
	char c1 = 'a', c2 = 'e';
	Swap(a1, a2); cout << a1 << " " << a2 << endl;
	Swap(b1, b2); cout << b1 << " " << b2 << endl;
	Swap(c1, c2); cout << c1 << " " << c2 << endl;

	return 0;

}

【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶)

 即使它们用的是同一个模板,但他们调用的并不是同一个函数,从汇编中就可以看出来:

【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶)

【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶) 

显式实例化

语法:函数名<类型>(实参1,实参2.....)

例:

template<typename T>
void Swap(T &x1, T &x2)
{
	T tmp = x1;
	x1 = x2;
	x2 = tmp;
}

int main()
{
	int a1 = 1, a2 = 2;
	double b1= 5.2, b2 = 6.4;
	char c1 = 'a', c2 = 'e';
	Swap<int>(a1, a2);   //显式实例化
	return 0;

}

其实有的时候我们不得不显示实例化模板:

【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶)

 

 模板参数的匹配原则

1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数;

例:

// 专门处理int的加法函数
int Add(int left, int right)
{
    return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{
    return left + right;
}
void Test()
{
    Add(1, 2); // 与非模板函数匹配,编译器不需要特化
    Add<int>(1, 2); // 调用编译器特化的Add版本
}

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

如下动图所示:

【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶)

 

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


三.类模板

定义格式

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

类模板的实例化

类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,也就是要显式实例化

注意:类模板名字不是真正的类,而实例化的结果才是真正的类

例:

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

类模板和模板类的区别

类模板

类模板是指定义一个通用的类模板,其中包含一个或多个类型参数,这些类型参数可以在实例化时被替换为具体的类型。

例:

template <typename T>
class MyContainer 
{
  public:
    void add(T element);
    T get(int index);
  private:
    T elements[100];
    int size;
};

在这个例子中:

1,`MyContainer` 是一个类模板

2,`T` 是一个类型参数,可以在实例化时被替换为具体的类型,例如 `int` 或 `double`。

模板类

模板类是指使用类模板生成的具体类

例:

//.....
MyContainer<int> intContainer;
MyContainer<double> doubleContainer;
//.....

在这个例子中:

1,`MyContainer<int>` 和 `MyContainer<double>` 都是模板类

2,它们是使用类模板 `MyContainer` 生成的具体类,分别用于存储 `int` 和 `double` 类型的        元素。


🐬🤖本篇文章到此就结束了, 若有错误或是建议的话,欢迎小伙伴们指出;🕊️👻

😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩

😍😁谢谢你的阅读。😸😼

【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶)

 

到了这里,关于【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Visual C++ 使用x64编译器

    使用cmake编译mysql connector c++的时候,输出信息发现一个问题。 C:Program Files (x86)Microsoft Visual Studio2017ProfessionalVCToolsMSVC14.16.27023bin目录下居然有两个目录 Hostx86 Hostx64 这两个目录下都有x86和x64两个子目录。此时就糊涂了,为啥有Hostx64和Hostx86呢,还比较一下,发现这两个目

    2024年02月07日
    浏览(72)
  • 使用Microsoft C++编译器配置VSCode

    在本教程中,您将在 Windows 上使用 Microsoft Visual c++ 编译器和调试器配置 Visual Studio Code 。 要成功完成本教程,您必须完成以下步骤: 1.安装Visual Studio Code。 2.安装VS Code的C/ c++扩展。你可以通过在Extensions视图中搜索’c++’ (Ctrl+Shift+X) 来安装C/ c++扩展。 3.安装Microsoft Visual c++ (

    2024年02月05日
    浏览(51)
  • C++ | 探究拷贝对象时的一些编译器优化

    👑作者主页:@烽起黎明 🏠学习社区:烈火神盾 🔗专栏链接:C++ 在传参和传返回值的过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还是非常有用的 经过深度探索类的六大天选之子学习,我们讲到了拷贝构造一些基本概念和调用形式 经过构造函数

    2023年04月19日
    浏览(76)
  • C++入门(小白篇1—编译器安装-代码注释等)

    最近想学一下一下C++看了一些博客内容写的倒是很充实,但是,细节不到位,我是有Python基础的,所以学习来蛮快的,但是对于小白的话,有好多小细节大多数博客还是不够详细,由此我想写一份相对细节一点的 我选择的是 【Red Panda Dev-C++】,官网:点我 1、这里可以改背景

    2024年02月13日
    浏览(36)
  • 【C++】在线编译器推荐,让你随时随地编写代码

    描述 文中所有网址,在 结论 中有汇总。 环境 版本号 描述 文章日期 2023-06-14 操作系统 Win11 - 21H2 - 22000.1335 Python 3.7.1 frida.exe 15.0.18 Repl.it 官网地址: https://repl.it/languages/cpp 需要登录 支持shell ,也就是说用户完全可以使用该linux服务器。 支持调试 支持各种其他工具 支持项目

    2024年02月15日
    浏览(53)
  • C++代码性能优化的好处与缺点?有哪些编译器优化选项?

    性能优化是C++编程中的一个重要方面,它可以带来许多好处,但也有一些潜在的缺点。 以下是C++代码性能优化的一些优缺点: 优点: 提高执行速度 : 优化后的代码可以更快地执行,这对于需要处理大量数据或需要快速响应的应用程序尤其重要。 减少资源消耗 : 优化可以减少

    2024年03月27日
    浏览(53)
  • vscode开发c++ 程序,配置使用微软自家的cl编译器。

    vscode 写c++代码, 配置为使用微软自己的cl编译器: 1.安装visual studio 2022, 并且创建一个可以正常编译的cpp工程。 2. 从visual studio 2022的菜单 项目 属性,查出include和lib的配置信息,并录入到window的系统环境变量中,当然还要把cl可执行文件的路径也录入到window11系统PATH中,如下

    2024年03月19日
    浏览(60)
  • C++面试八股文:std::array如何实现编译器排序?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面: 面试官: array 熟悉吗? 二师兄:你说的是原生数组还是 std::array ? 面试官:你觉得两者有什么区别? 二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且

    2024年02月10日
    浏览(48)
  • Linux C++性能优化秘籍:从编译器到代码,探究高性能C++程序的实现之道

    随着大数据、人工智能等技术的飞速发展,程序性能优化的重要性愈发突出。优化性能可以降低资源消耗、提高系统响应速度,从而在有限的硬件资源下,实现更高的吞吐量和处理能力。此外,性能优化也有助于降低能耗、减少散热问题,延长硬件使用寿命。 Linux操作系统具

    2023年04月09日
    浏览(46)
  • 【C++精华铺】6.C++类和对象(下)类与对象的知识补充及编译器优化

    目录 1. 再谈构造 1.1 成员变量的初始化(初始化列表) 1.2 初始化列表的行为 1.3 explicit  2. 类中的static成员 2.1 静态成员变量 2.2 静态成员函数 3. 友元 3.1 友元函数 3.1 友元类 4. 内部类  5. 匿名对象  6. 对象拷贝时候的编译器优化           为什么还要去看初始化的问

    2024年02月13日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包