【c++模板笔记一】模板的介绍及其重载

2015年2月11日周三晴

有一段时间没有更新博客了,这几天在整理前段时间所学的c++知识点就没有更新了。最近开始研究c++的模板的STL,于是开始继续写下自己的一点所得吧。

模板和STL都是c++中比较实用的东西,能把我们省下很多事情(简化编码)。今天作为模板的第一讲,今天讲的模板其实主要是介绍函数模板。模板还有类模板(我们明天介绍)。

————————————————————分割线——————————————————————

一、为什么需要函数模板?

在介绍什么是函数模板之前,我们还是先一起想想,到底为什么需要这个东西呢?刚好可以复习前面的知识点。

现在我们一起来设计程序:用函数来求两个变量中的最大值(这两个变量,可能是int,double和const char*)。

首先,我们用最传统的c语言的 解决方法来写代码:

#include <stdio.h>#include <string.h>int max_int(int a,int b){return a > b ? a : b;}double max_double(double a,double b){return a > b ? a : b;}const char* max_char(const char* a,const char* b){return strcmp(a,b) > 0 ? a : b;}int main(){printf("%d\n",max_int(100,200));printf("%f\n",max_double(1.2,2.2));printf("%s\n",max_char("hello","world"));return 0;}

因为变量的类型不同,我们必须设计不一样的函数去分别解决他们。

一共有三种类型,就要去定义三个函数,如果有100种类型,就要去定义100个函数。这就是函数的一个缺点:虽然能保证函数结果不会出一点错,但是必须为不同类型的进行不同的函数实现。

是不是感觉有点麻烦啊?你说有没有什么简单的方法啊?(c语言中没有函数重载哦,重载我们下面再讲。)其实在之前c程序猿就开始想这个问题了——如果做到类型无关。

于是,在c语言中就提出了一个东西——函数宏(带参宏)

关于什么是函数宏我们这里不做过多的介绍,如果又不懂的同学请自觉向度娘学习。我们用函数宏的方法,解决上面的这个问题:

#include <stdio.h>#include <string.h>#define Max(a,b) ((a) > (b) ? (a) : (b))int main(){printf("%d\n",Max(100,200));printf("%f\n",Max(1.2,2.2));printf("%s\n",Max("hello","world"));return 0;}

函数宏的原理就是,在预编译时所有Max(a,b) 都会自动被替换为((a) > (b) ? (a) : (b))。所以我们可以看到答案基本正确。但是请仔细看第三个答案,为什么“hello”比“world”大!按照字符串比较原则, 明明“world”大啊!

还记得我们在进行字符串比较的时候都是用strcmp()函数的吗?直接比较会有什么后果?直接比较的话,其实比较的是两个const char*变量,是在比较指针而不是指针所指向字符串的值!!!这就是函数宏的一个缺点:虽然能适用于大多数参数类型,不能保证所有对所有类型都安全。

看来在c中没有很好的解决这个问题啊!

我们用c++来试试!其实我知道你憋了很久了,你肯定迫不及待的想使用函数重载了!(如果你对于c++的函数重载还不是很懂,欢迎点开我的【c++笔记二】重载(overload)之一看你就懂)

下面我们就用函数重载写一写:

#include<iostream>using namespace std;int Max(int a,int b){return a>b?a:b;}double Max(double a,double b){return a>b?a:b;}string Max(string a,string b){return a>b?a:b;}int main(){cout<<Max(100,200)<<endl;cout<<Max(1.2,2.2)<<endl;cout<<Max("hello","world")<<endl;return 0;}

在c++中我们用string类取代了c语言中的字符串数组(char*),直接使用“>”去比较两个字符串就更安全了。

或许你可以发现,针对三个类型我们还是写了三个函数,但是和c语言比较起来至少函数名都一样了(不用费脑筋去想各种各样的函数名了)。而且你发现没有,函数的实现体都是一模一样的,这样的重载函数多了,你会发现代码有点冗余。

所以,c++正式引入——模板!

终于扯到我们今天的重点上来了,模板在经历了我们说的:函数、宏函数、重载之后,综合了三者所长。你想,你做个视频,网上有各种视频模板素材,你只要套着模板自己修改一下就可以做出高大上的视频了。做PPT也可以用模板、做简历也有模板。生活中充斥着各种各样的模板,,模板给我们带来的便利自然不用我多说吧?童同样的,用上了c++的模板之后,我们也可以省很多事呢!下面正式开始讲解模板。

二、模板的定义和使用1.定义语法:

template<typename 类型形参1, typename 类型形参2, …>返回类型 函数模板名 (调用形参表) {

函数体;

}

人生没有彩排,每天都是现场直播。

【c++模板笔记一】模板的介绍及其重载

相关文章:

你感兴趣的文章:

标签云: