C++中的函数重载与模板

函数就像工具,工具有好多种,我们就以螺丝刀为例来感受一下它和函数重载和模板的一些相似关系。

螺丝刀的种类有很多,常见的是一字型和梅花型, 每种类型从小到大又有好多个号。 我们根据螺丝样式和大小

选择使用那种类型的和选择多大号的螺丝刀。 螺丝刀就干了一件事,拧螺丝,也就是说各种螺丝刀他们的功能是相

同的,只是类型不同而已。

一、函数重载

在C++中,允许用一个函数名来表达功能相同,只是操作类型(形参个数和类型)不同的函数,这就是函数重载。

编译器能够根据他们各自的实参和形参以及参数的个数进行最佳分配,自动决定调用哪一个函数体。看下面这个例

子。

<span style="font-size:18px;">#include<iostream>
using namespace std;
int <span style="color:#ff0000;">add</span>(int x,int y)         //一字 <span style="color:#ff0000;">螺刀</span>(一字,5号)
{
	cout<<"(int,int)\t";
	return x+y ;
}
double <span style="color:#ff0000;">add</span>(double x ,double y) //梅花 <span style="color:#ff0000;">螺刀</span>(梅花,5号)
{
	cout<<"(double,double)\t";
	return x+y;
}</span>

明白了函数重载我们还得注意一个问题:

如果函数名相同、形参表也相同,仅仅是返回类型不同,是非法的。就像下面这个例子一样,当需要一字5号螺丝刀

时,不知道选哪个类型的螺刀。

<span style="font-size:18px;"><span style="color:#ff0000;">int</span> add(int x,int y)         //<span style="color:#ff0000;">一字</span> 螺刀(一字,5号)
{
	cout<<"(int,int)\t";
	return x+y ;
}
<span style="color:#ff0000;">double</span> add(int x,int y) //<span style="color:#ff0000;">梅花</span> 螺刀(一字,5号)
{
	cout<<"(double,double)\t";
	return x+y;
}</span>

二、函数模板

螺丝刀机器可以制造出不同类型的螺丝刀,在这里有个函数模板,能够生成不同类型的函数。

模板形式为:

<span style="font-size:18px;">template <class 类型名1,class 类型名2,…>

返回类型   函数名 (形参表)
{
	函数体;
}</span>

我们来看看螺丝刀时如何制作的

<span style="font-size:18px;">#include<iostream>
using namespace std;

template <样式类,规格类>

 样式1 螺刀(样式1,规格1)
 {
	加工;
	返回成品;
 }
 int main()
 {
	cout<<螺刀(一字,5号)<<endl;
	cout<<螺刀(梅花,5号)<<endl;
	return 0;
 }</span>

最后成品分别为 一字 螺刀(一字,5号)  和 
梅花 螺刀(梅花,5号)

三、区别和联系

将逻辑功能相同的而函数参数和函数值类型不同的多个重载函数用一个函数来描述,函数模板创建一个通用功能

函数,支持多种不同的形参,简化了重载函数的函数体设计,使代码的可重用性大大提高,从而提高软件的开发效

率。我们需要什么工具,就把参数给机器,直接加工出来使用即可。

时间: 2024-12-06 13:26:52

C++中的函数重载与模板的相关文章

c++中的函数重载

c++中的函数重载 什么是函数重载 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,这组函数被称为重载函数. 函数重载的作用 重载函数常用来实现功能类似而所处理的数据类型不同的问题,能减少函数名的数量,提高程序的可读性. 重载函数的构成说明 定义一个类,添加一系列函数名相同的函数,但参数形式各有不同,测试一下能否构成重载. #include <iostream> using names

关于在C#中对函数重载理解

函数重载是个什么概念,才接触的这个概念的时候我也是完全昏了,还在自己看看了书后就理解了.那什么是函数重载呢?我个人理解的是在同一个作用域下有多个同名的函数,但是他们的形参的类型是不同的,或者参数个数是不同的.当我们调用这些函数时,怎么判断我们调用的是那一个函数呢,这个就要看你在使用重载函数时所传参数的类型或者参数个数.好了,话不说.看看代码就知道了. using System;namespace overload{    class a    {        public void print

js中没有函数重载,怎样实现函数重载的功能?

js中没有函数重载,javasript中使用可选参数:arguments实现相同的功能.. 函数在定义的时候可不定义参数: <script type="text/javascript" > function say() { for (var i = 0; i < arguments.length; i++) { alert(arguments[i].toString()); } } </script> 调用:<input type="but

实验二:函数重载、模板、简单类的定义和实现

[实验结论] #函数重载 编写重载函数add(),实现对int型,double型,Complex型数据的加法.在main()函数中定义不同类型 数据,调用测试. #include<iostream> using namespace std; struct Complex { double real; double imaginary; }; //函数声明 int add(int a, int b); double add(double a,double b); Complex add(Comp

对比C++与Java中的函数重载、覆盖、和隐藏

                                  在C++中 1.函数的重载 C++中的函数的重载要求的是  函数名相同 参数列表必须不同  返回值类型可以相同也可以不相同:只有参数列表不相同,在函数调用时,编译环境才能准确抉择调用的是哪个函数.例如:void display():void display(int  i);void dispaly(double  i);void  display(int i,double i); void display(double  i,i

C/C++中的函数重载(overloading)

几年前,我已经介绍过如何使用const和volatile限定词声明数据.使用这些限定词来声明数据,产生的影响会波及到函数的声明.在C和C++中,影响是不一样的,很大程度上是因为C++中的函数声明比C有更多的功能.为了更清楚描述清楚影响的不同,我们先来看看C和C++中函数最主要的差异是什么. 很多C库包含至少一组的命名非常接近的函数.每个函数除了参数或返回值不同,功能在本质上是相同的. 标准C库也包含若干这样的组.例如,有一组“abs”函数专门用来计算一个数值的绝对值.组里包含: int abs(

3.2 STL中的函数对象类模板

*: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. 2)less是STL中最常用的函数对象类模板,其定义如下: template<class _Tp> struct less { bool oprator()(const _Tp&_x,const _Tp&_y)const { return _c<_y; } } 要判断两个i

第29课 类中的函数重载

函数重载回顾: 类中的重载: 万变不离其宗: 类中的普通成员函数和静态成员函数也够成重载. 示例程序: 1 #include <stdio.h> 2 3 class Test 4 { 5 int i; 6 public: 7 Test() 8 { 9 printf("Test::Test()\n"); 10 this->i = 0; 11 } 12 13 Test(int i) 14 { 15 printf("Test::Test(int i)\n"

类中的函数重载

函数重载回顾: - 函数重载的本质为相互独立的不同函数; -C++通过函数名和函数参数确定函数调用. -无法直接通过函数名得到重载函数的入口地址. -函数重载必然发生在同一作用域. 类中的重载: -构造函数的重载; -普通成员函数的重载 -静态成员函数的重载 Question: 全局函数,普通成员函数以及静态成员函数之间是否可以构成重载. 万变不离其宗: 1.重载函数的本质为多个不同的函数. 2,函数名和参数列表是唯一的标识符; 3.函数重载必然发生在同一作用域. 深度的意义: -通过函数名对函