函数/函数重载/函数模板/重载的模板

概述:

        上述4个概念都是函数。直接用名称调用。和普通函数的使用没有区别。

        之所以有这么多概念,是为了方便写代码。少写一些有规律的代码。毕竟嘛,程序员,能少写一句,绝不多写一个标点。所以。就想出了很多奇奇怪怪省事的方法并给了一个拗口的名称。至于为啥拗口,可能吧,程序员们的语文都不怎么好吧。所以后来的人,跟着学,学的也很费力。因为光读名称都被绕死了。

无所谓。

学习这些概念前,先要了解为什么会有这些概念及方法。是为了解决什么问题。按这上思路介绍这4个概念。

具体使用的时候,没有区别,都是函数名加参数。只是定义的时候不一样。

先说函数。

只写原型,省略实际定义。

函数:void fun(int a,int b);

就是为了把要干A这件事的方法集中写在一起,取个名称叫fun,以再干A这件事,就直接用fun这个名称,不需要把函数里的内容再重新写一遍。省了干一遍,写一遍的麻烦,于是,就有了函数。

再说函数重载:

void fun(int a,int b);//初始函数

void fun(int a,int b,double c)。//函数重载

重载是为了一件事写一个函数,有时可能有个别情况,比如,吃饭,有时用筷子,有时用叉子。好像a解决不了。那就这样。重新写一个。但是名称不能改,还是叫吃饭。方便沟通。总不能用筷子吃饭,就说吃饭,用叉子时,就说吃屎吧。统一都叫吃饭,不管用叉子还是筷子。这里的筷子或叉子,在函数里,就是指函数的参数类型。

所以,函数重载,只是函数的输入参数(专业点就叫,特征标)不同(不同,具体指类型不同。非默认的参数数量是相同的)。

接着说函数模板:

template <class T>

void fun(T a,Tb)

函数重载要求特征标不同,就写一个函数,是不是很麻烦,能不能不写?

也能,也不能。要分情况看。

有些情况是可以有。比发说,上述中,只能特征标的类型不同,数量还是相同的。这时,就可以省事点,不重载(毕竟重载,也是要写一遍函数定义的。)。

有些情况不行,比如说,特征标数量不同了,就不能用函数模板(但是,聪明如你,一定想到了,可以用重载模板啊。对,不过这个稍后说。先说模板。)

所以,有了函数模板。假如,输入有时上int的,有时是double的。那就不用具体的类型,取一个代号,暂且称为T。这样就只用写一个函数了,不需要int写一个,double类型也写一个,又省事了。这就相当于建一个模板。

细说模板:

模板具体化和模板实例化(显式)

模板是人写给编译器用的。编译器在编译代码时,遇到调用这个函数时,先根据这个模板,结合调用函数实际参数的使用类型,将实际的类型代入模板里,生成一个实际的函数。(然后再编译)。这是一个自动的过程,所以叫隐匿实例化。

其实,也可以人为强制实例化,不用等到调用时,编译器再生成实例。直接就在代码里定义此时、此地就要实例化。这时,就叫显式实例化。

模板实例化的写法:tempate fun<T>(T a,Tb);

模板实例化也可以在调用时创建:fun<T>(a,b);即指定a,b按T这种类型创建实例。

模板本身,也可以特殊指定。比如,定义好一个模板,但是对于参数是某种类型时,就要用指定的具体模板,而不是通用的模板来生成函数。这就叫模板具体化。

模板具体化的写法:template<> fun<T>(T a, T b)。(注意和实例化的<>的区别)。

最后说重载的函数模板

和函数重载一样,只是写成模板的形式:

template<class T> void fun(T a,T b);//初始模板

template<class T>void fun(T a,T a[],T *c, int n);//重载模板。

***************

一个模板可以同时多个T1,T2,T3。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值