c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则)

什么叫泛型编程?1. 参数类型化。 2. 模板

模板概念

c++提供了函数模板,所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。

  1. c++提供两种模板机制:函数模板类模板
  2. 类属–类型参数化,又称参数模板

总结

  1. 模板把函数或类要处理的数据类型参数化,表现为参数的多态性,成为类属
  2. 模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为。

函数模板

  1. template <class / typename T> 告诉编译器紧跟的代码出现T不要报错

  2. 类型也需要传入,类型参数化

  3. 自动类型推导

  4. 显示指定类型

     #include<iostream>using namespace std;//交换int 类型的两个文字void mySwaoInt(int &a, int &b){int tmp = a;a = b;b = tmp;}//交换double的数据void mySwapDouble(double &a, double &b){double tmp = a;a = b;b = tmp;}//类型,逻辑又非常相似//类型参数化,泛型编程--模板技术template<class T>//告诉编译器  下面如果出现T不要报错,T是一个通用的类型void mySwap(T &a, T &b){T tmp = a;a = b;b = tmp;}//template<typename T> 等价于template<class T>template<typename T>void mySwap2(){};void test01(){int a = 10;int b = 20;char c1 = 'c';//mySwaoInt(a, b);//1. 自动类型推导,必须有参数类型才可以推导//2.参数类型必须一样//mySwap(a, c1);//推导不出来T,所以不能运行mySwap(a, b);//2.显示指定类型mySwap<int >(a, b);//模板必须要指定出T才可以使用mySwap2<double>();cout << "a=" << a << endl;cout << "b=" << b << endl;double c = 3.14;double d = 1.1;//mySwaoInt(a, b);mySwap(c, d);}int main(){test01();system("pause");return 0;}
    

利用模板实现数组排序

    #include<iostream>using namespace std;//对char 和 int 数组进行排序 ,排序规则 从大到小 利用选择排序template<class T>void mySwap(T &a, T &b){T tmp = a;a = b;b = tmp;}template<class T>void mySort( T arr[], int len){//选择排序for (int i = 0; i < len; i++){int max = i;for (int j = i + 1; j < len; j++){if (arr[max] < arr[j]){//交换 下标max = j;}}if (max != i){//交换数据mySwap(arr[max], arr[i]);}}}//输出数组元素的模板template <class T>void printArray(T arr[], int len){for (int i = 0; i < len; i++){cout << arr[i] << " ";	}cout << endl;}void test01(){char charArr[] = "helloword";int num = sizeof(charArr) / sizeof(char);mySort(charArr, num);printArray(charArr, num);int intArr[] = { 1, 4, 100, 34, 55 };int num2 = sizeof(intArr) / sizeof(int);mySort(intArr, num2);printArray(intArr, num2);}int main(){test01();system("pause");return 0;}

函数模板和普通安徽念书在一起调用规则

区别 :普通函数可以进行隐式类型转换,模板不行。

  1. c++编译器优先考虑普通函数

  2. 可以通过空模板实参列表的语法限定编译器只能通过模板匹配

  3. 函数模板可以像普通函数那样可以被重载

  4. 如果函数模板可以产生一个更好的匹配,那么选择模板

     #include<iostream>using namespace std;//1. 普通模板与函数模板区别template <class T>T myPlus(T a, T b){return a + b;}int myPlus2(int a, int b){return a + b;}void test01(){int a = 10;int b = 20;char c = 'c';//a=97.c=99//myPlus(a, c);//类型推导不出来cout << myPlus2(a, c) << endl;//10+99 普通函数  可以进行隐式类型转换}//2. 普通函数和函数模板的调用规则template<class T>void myPrint(T a, T b){cout << "模板调用的myPrint" << endl;}template<class T>void myPrint(T a, T b,T c){cout << "模板调用的myPrint(a,b,c)" << endl;}void myPrint(int a, int b){cout << "普通的函数调用myPrint" << endl;}void test02(){int a = 10;int b = 20;//如果出现重载,优先使用普通模板的调用,如果没有实现普通函数,出现错误//myPrint(a, b);//如果想强制调用模板,那么可以使用空参数列表myPrint<>(a, b);//3. 函数模板可以发生重载int c = 30;myPrint(a, b, c);//如果函数模板可以产生更好的匹配,那么优先使用函数模板char e = 'c';char d = 'd';myPrint(c, d);}int main(){//test01();test02();system("pause");return 0;}
    

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

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

相关文章

c++模板--2(模板机制,模板的局限性,类模板,类模板做函数的参数)

函数模板机制结论 编译器并不是把函数模板处理成能狗处理任何类型的函数函数模板通过具体类型产生不同的函数编译器会对函数模板进行两次编译&#xff0c;在声明的地方对模板代码的本身进行编译&#xff0c;在调用的地方对参数替换后代码进行编译在编译器编译阶段&#xff0c;…

arm-linux 交叉编译 mp4v2

2014-09-23 14:44 1901人阅读 评论(0) 收藏 举报 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 1、下载mp4v2的源代码&#xff08;http://code.google.com/p/mp4v2/downloads/list&#xff09;mp4v2-2.0.0.tar.bz2 2. 进入相应目录 ./configu…

c++模板---3(类模板碰到继承问题,类模板类外实现,类模板与友元函数)

类模板碰到继承问题 基类如果是模板类&#xff0c;必须让子类告诉编译器 基类中的T到底是什么类型 如果不告诉&#xff0c;那么无法分配内存&#xff0c;编译不过 利用参数列表class Child :public Base<int> #include<iostream>using namespace std;template&l…

Linux USB札记

嵌入式linux内核添加USB模块&#xff08;U盘&#xff09;支持 使用menuconfig工具进行配置 1、Device Drivers->SCSI device support->SCSI disk support此选项必须勾选 2、Device Drivers->USB support->Support for Host-side USB 此选项选中后会出现子菜单&…

c++实现任意类型数组类的封装

MyArray.hpp #pragma once #include<iostream> #include<string> using namespace std; template<class T>class MyArray { public://构造explicit MyArray(int capacity) //防止隐式类型转换&#xff0c;防止MyArray arr 10{this->m_Capacity capacity…

Linux内核配置选项 (经典学习)

转载地址http://book.csdn.net/bookfiles/972/10097230254.shtml 2.5 Linux内核配置选项 下面以最新的Linux 2.6.20内核为例&#xff0c;介绍比较常用的一些Linux内核配置选项&#xff0c;其他选项读者可以参考系统提供的帮助信息。 需要说明的是&#xff0c;在内核配置中&am…

深入理解linux系统下proc文件系统内容

另外&#xff0c;可以参考这个http://www.centos.org/docs/5/html/5.1/Deployment_Guide/ch-proc.html 内容摘要&#xff1a;Linux系统上的/proc目录是一种文件系统&#xff0c;即proc文件系统。 Linux系统上的/proc目录是一种文件系统&#xff0c;即proc文件系统。与其它常见…

c++中的异常--1(基本概念, c语言中处理异常,c++中处理异常,异常的基本使用,栈解旋)

异常基本概念 异常处理就是处理程序中的错误&#xff0c;所谓错误是指在程序运行的过程中发生的一些异常事件&#xff08;如&#xff1a;除0退出&#xff0c;数组下标越界&#xff0c;所要读取的文件不存在&#xff0c;空指针&#xff0c;内存不足等等&#xff09; c语言中处…

RGB、YUV和YCbCr

之前对RGB、YUV和YCbCr一直没有清晰的理解和认识&#xff0c;今天打算做一个小结&#xff0c;结合网上的文章谈谈自己的看法&#xff0c;也希望有机会看到这篇文章的人能指点一二&#xff0c;相互交流&#xff0c;共同进步。 首先要说明&#xff0c;上述的RGB、YUV和YCbCr都是人…

c++中的异常---2(异常接口声明,异常变量的生命周期,异常的多态使用)

异常接口声明 为了加强程序的可读性&#xff0c;可以在函数声明中列出可能抛出异常的所有类型&#xff0c;例如&#xff1a;void func() throw(A,B,C);这个函数func能够且只能抛出类型A,B,C及其子类的异常如果在函数声明中没有包含异常接口声明&#xff0c;则此函数可以抛任何…

c++中的异常---3(系统标准异常库,编写自己异常类)

系统标准异常库 #incldue out_of_range 等… #include<iostream>#include<string>using namespace std;//系统提供标准异常#include<stdexcept>class Person{public:Person(string name, int age){this->m_Name name;//年龄做检测if (age<0 || age&g…

H.264中IDR帧和I帧区别

IDR&#xff08;Instantaneous Decoding Refresh&#xff09;--即时解码刷新。I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便&#xff0c;要首个I帧和其他I帧区别开&#xff0c;所以才把第一个首个I帧叫IDR&#xff0c;这样就方便控制编码和解码…

c++中的IO流(流的概念和流类库的结构,标准的输入输出流)

流的概念和流类库的结构 程序的输入指的是从输入文件将数据传送给程序&#xff0c;程序的输出指的是从程序将数据传送给输出文件 c输入输出包含以下三个方面的内容 对系统指定的标准设备的输入输出。即从键盘输入数据&#xff0c;输出到显示器屏幕&#xff0c;这种输入输出称…

MTD应用学习札记

今天做升级方案用到了mtd-utils中的flash_eraseall和flash_cp两个工具&#xff0c;在进行方案验证的时候&#xff0c;遭遇到各种不解和疑惑&#xff0c;因对MTD的原理不熟悉&#xff0c;所以只能多次尝试&#xff0c;虽然最后把方案搞定了&#xff0c;不过觉得MTD中的mtd和mtdb…

c++中的文件读写的操作

写文件 ofstreamopen指定打开方式isopen判断是否打开成功ifs<<“数据”ofs.close&#xff08;&#xff09; 读文件 ifstream ifs 指定打开方式ios::in isopen判断是否打开成功 读取有三种方式 #include<iostream>using namespace std;//文件读写头文件#incl…

udhcpc命令

由于要使用网络通讯&#xff0c;所以不可避免的要用到dhcp。理想的网络通讯方式是下面3种都要支持: 1,接入已有网络。这便要求可以作为dhcp客户端。 2,作为DHCP服务器&#xff0c;动态分配IP。 3,指定固定IP 第3种情况没有什么好说的&#xff0c;简单说下前2种情况。 使用步骤&…

c++的STL--1概念通述

STL的概念 什么是STL? STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架。 STL从广义上分为&#xff1a;容器(container)&#xff0c;算法(algorit…

socket通信和异常处理札记

Linux socket通信出现CLOSE_WAIT状态的原因与解决方法 这个问题之前没有怎么留意过&#xff0c;是最近在面试过程中遇到的一个问题&#xff0c;面了两家公司&#xff0c;两家公司竟然都面到到了这个问题&#xff0c;不得不使我开始关注这个问题。说起CLOSE_WAIT状态&#xff0c…

mac 下使用wireshark监听网络上的数据

分三个步骤&#xff1a; 1.wireshark安装 wireshark运行需要mac上安装X11&#xff0c;mac 10.8的系统上默认是没有X11的。先去http://xquartz.macosforge.org/landing/下载最新的 xquartz安装&#xff0c;安装好就有X11了。 wireshark的下载&#xff0c;网…

c++的vector容器

vector容器概念 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它…