1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,C++ 中支持泛型编程技术,C++ 中的函数  模板和类模板就是 C++ 中泛型编程技术,本文分析 C++ 中的模板;

2,每一样技术  的引入都是为了解决一定的问题,下面将通过一个例子让大家意识到问题的存在,才能体会泛型编程的精妙之处;

3,C++ 中有几种交换变量的方法?

1,宏代码块;

2,函数;

4,定义宏代码块 VS 定义函数(全局的):

5,变量的交换编程实验:

 #include <iostream>
#include <string> using namespace std; #define SWAP(t, a, b) \ // 宏能够完美的解决交换的问题,但是由于宏是预处理器处理的单元,也就是后续的编译器根本不知道宏的存在,因此不建议用宏完成类似的函数功能,推荐直接写函数;
do \
{ \
t c = a; \
a = b; \
b = c; \
}while() void Swap(int& a, int& b) // 要用引用来交换
{
int c = a;
a = b;
b = c;
} void Swap(double& a, double& b)
{
double c = a;
a = b;
b = c;
} void Swap(string& a, string& b)
{
string c = a;
a = b;
b = c;
} int main()
{
/*
int a = 0;
int b = 1; Swap(int, a, b); cout << "a = " << a << endl; // a = 1;
cout << "b = " << b << endl; // b = 0; double m = 2;
double n = 3; Swap(double, m, n); cout << "m = " << m << endl; // m = 3;
cout << "n = " << n << endl; // n = 2;
*/
int a = ;
int b = ; Swap(a, b); cout << "a = " << a << endl; // a = 1;
cout << "b = " << b << endl; // b = 0; double m = ;
double n = ; Swap(m, n); cout << "m = " << m << endl; // m = 3;
cout << "n = " << n << endl; // n = 2; string d = "Delphi";
string t = "Tang"; Swap(d, t); cout << "d = " << d << endl; // d = Delphi;
cout << "t = " << t << endl; // t = Tang; return ;
}

1,每当要交换两个变量的值的时候,就需要重载 Swap() 函数,而 Swap() 函     数的程序逻辑一点改变都没有,做的仅仅是复制粘贴改类型,这其实是重复的没有技术含量的活;

2,使用宏不安全、函数重载复制粘贴改类型,重复性劳动;

6,定义宏代码块:

1,优点:代码复用,适合所有的类型;

2,缺点:编译器不知道宏的存在,缺少类型检查(不安全);

定义函数:

1,优点:真正的函数调用,编译器对类型进行检查;

2,缺点:根据类型重复定义函数,无法代码复用;

7,C++ 中有没有解决方案集合两种方法的优点?

1,有,泛型编程;

8,泛型编程概念:

1,不考虑具体数据类型的编程方式;

1,对于 Swap 函数可以考虑下面的泛型写法:

1,代码示例:

 void Swap(T& a, T& b)
{
T t = a;
a = b;
a = t;
}

2,Swap 泛型写法中的 T 不是一个具体的数据类型,而是泛指任意的数据类型;

9,C++ 中泛型编程:

1,函数模板:

1,一种特殊的函数可用不同类型进行调用;

2,看起来和普通函数很相似,区别是类型可被参数化:

1,代码示例:

 template<typename T>  // 定义了一个模板,里面有一个类型名 T,泛指各种类型;
void Swap(T& a, T& b)
{
T t = a;
a = b;
b = t;
}       

3,函数模板的语法规则:

1,template 关键字用于声明开始进行泛型编程;

2,typename 关键字用于声明泛指类型;

4,函数模板的使用:

1,自动类型推导调用;

1,根据实参类型进行推导;

2,具体类型显示调用;

 int a = ;
int b = ; Swap(a, b); // 自动推导;根据参数自动推导模板中的 T 应该为 int 类型; float c = ;
float d = ; Swap<float>(c, d); // 显示调用;显示告诉函数模板中的 T 是一个 float 类型;

10,函数模板使用初探编程实验:

 #include <iostream>
#include <string> using namespace std; template < typename T > // 开始泛型编程,泛指类型是 T;在下面函数定义中用 T 可以代表类型;
void Swap(T& a, T& b)
{
T c = a;
a = b;
b = c;
} template < typename T >
void Sort(T a[], int len)
{
for(int i=; i<len; i++)
{
for(int j=i; j<len; j++)
{
if( a[i] > a[j] )
{
Swap(a[i], a[j]);
}
}
}
} template < typename T >
void Println(T a[], int len)
{
for(int i=; i<len; i++)
{
cout << a[i] << ", ";
} cout << endl;
} int main()
{
/* 以下是交换数据函数模板测试代码 */
int a = ;
int b = ; Swap(a, b); // 自动推导,等价于 Swap<int>(a, b); cout << "a = " << a << endl; // a = 1;
cout << "b = " << b << endl; // b = 0; double m = ;
double n = ; Swap(m, n); // 自动推导,等价于 Swap<double>(a, b); cout << "m = " << m << endl; // m = 3;
cout << "n = " << n << endl; // n = 2; string d = "Delphi";
string t = "Tang"; Swap<string>(d, t); //显示指定;将 T 替换成 string,然后进行调用; cout << "d = " << d << endl; // d = Delphi;
cout << "t = " << t << endl; // t = Tang; /* 以下是选择排序算法测试代码 */ int a[] = {, , , , }; Println(a, ); // 5, 3, 2, 4, 1
Sort(a, ); // 自动推导
Println(a, ); // 1, 2, 3, 4, 5 string s[] = {"Java", "C++", "Pascal", "Ruby", "Basic"}; Println(s, ); // Java, C++, Pascal, Ruby, Basic,
Sort(s, );
Println(s, ); // Basic, C++, Java, Pascal, Ruby, return ;
}

1,使用函数模板程序中代码复用率大大增加;

2,大公司中自己通用库都是使用泛型编程、模板技术来完成的;

3,模板技术、泛型编程,非常适合于用来写算法,通用库都是使用模板技术完成;

11,小结:

1,函数模板是泛型编程在 C++ 中的应用方式之一;

1,之二是类模板;

2,函数模板能够根据实参对参数类型进行推导;

3,函数模板支持显示的指定参数类型;

4,函数模板是 C++ 中重要的代码复用方式;

C++中函数模板的概念和意义的更多相关文章

  1. C++中类模板的概念和意义

    1,在 C++ 中是否能够将泛型的思想应用于类? 1,函数模板是将泛型编程的思想应用于函数,就有了函数模板: 2,可以,常用的 C++ 标准库就是 C++ 中的标准模板库,C++ 中的 STL 就是将 ...

  2. 为什么 c++中函数模板和类模板的 声明与定义需要放到一起?

    将模板的声明与定义写在一起实在很不优雅.尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义, 然后在main函数里包含.h头文件,这样会报链接错误.why!!!!!!!!!!!!! 这是因为 ...

  3. C++中函数模板的深入理解

    1,函数模板深入理解: 1,编译器从函数模板通过具体类型产生不同的函数: 1,模板就是模子,通过这个模子可以产生很多的实物: 2,函数模板就是编译器用来产生具体函数的模子: 2,编译器会对函数模板进行 ...

  4. C++中组合和继承的概念及意义

    1,继承在面向对象中具有举足轻重的地位,面向对象当中的很多高级技术都和继承是息息相关的,比如面向对象的高端课程<设计模式>中的每一种技术都和继承有关,因此我们非常有必要在学习 C++ 时, ...

  5. C++中的模板编程

    一,函数模板 1.函数模板的概念 C++中提供了函数模板,所谓函数模板,实际上是建立一个通用函数,其函数的返回值类型和函数的参数类型不具体指定,用一个虚拟的类型来表示.这个通用函数就被称为函数的模板. ...

  6. STL模板_概念

    模板和STL一.模板的背景知识1.针对不同的类型定义不同函数版本.2.借助参数宏摆脱类型的限制,同时也因为失去的类型检查而引 入风险.3.借助于编译预处理器根据函数宏框架,扩展为针对不同类型的 具体函 ...

  7. C++中多态的概念和意义

    1,函数重写回顾: 1,父类中被重写的函数依然会继承给子类: 2,子类中重写的函数将覆盖父类中的函数: 1,重写父类当中提供的函数是因为父类当中提供的这个函数版本不能满足我们的需求,因此我们要重写: ...

  8. C++中的函数模板

    我们在定义函数时,可以通过定义函数模板,来简化一些功能相同而数据类型不同的函数的定义和调用过程. C++中的函数模板 对于类的声明来说,也有同样的问题.有时,有两个或多个类,其功能是相同的,仅仅是数据 ...

  9. [C++基础]那些容易被混淆的概念:函数/数组指针-指针函数/数组,类/函数模板-模板类/函数

    函数指针-指针函数 函数指针的重点是指针.表示的是一个指针,它指向的是一个函数.eg: int (*pf)(); 指针函数的重点是函数.表示的是一个函数,它的返回值是指针.eg: int* fun() ...

随机推荐

  1. 51 Nod 1068 Bash游戏v3

    1068 Bash游戏 V3  题目来源: Ural 1180 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 有一堆石子共有N个.A B两个人轮流 ...

  2. poj 3662 Telephone Lines dijkstra+二分搜索

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5696   Accepted: 2071 D ...

  3. Tire(字典树)

    Tire 字典树,又称为单词查找树,Tire 树,是一种树形结构,它是哈希树的变种. 实现原理: 字典树与字典很相似,当要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不 ...

  4. ping不通服务器就邮件警告

    ping不通服务器就发一封邮件 (单台) vim /root/scipt/1.sh #!/bin/bash ping -c 4 192.168.0.116 &> /dev/null #p ...

  5. plt.plot() 无法使用参数ax

    问题参考 TypeError: inner() got multiple values for keyword argument 'ax' fig, ax=plt.subplots(2,1) plt. ...

  6. LeetCode 54. 螺旋矩阵(Spiral Matrix) 剑指offer-顺时针打印矩阵

    题目描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, ...

  7. spark 笔记 13: 再看DAGScheduler,stage状态更新流程

    当某个task完成后,某个shuffle Stage X可能已完成,那么就可能会一些仅依赖Stage X的Stage现在可以执行了,所以要有响应task完成的状态更新流程. ============= ...

  8. [NLP] 语义网络与知识图谱入门(二)

    语义网络与知识图谱入门(二) OWL 本体声明 owl用owl:Ontology来声明一个本体.rdf:about属性为本体提供一个名称或引用.根据标准,当rdf:about属性的值为"&q ...

  9. ImportError: cannot import name 'Document'

    一种常见的原因是,程序文件的名字不对. 程序文件的名字不能和 import lib 里的名字冲突. 一个例子: 如果程序文件名字是 docx.py,程序又 from docx import Docum ...

  10. NSIS打包electron程序为exe安装包

    在我的上一篇博客已经介绍了将electron程序生成一个exe可执行文件,但是这并不是最终能够发给用户用来安装的最终安装包,下面我们就介绍如何使用NISI将我们的应用程序打包成安装包: 上一篇博客我们 ...