函数重载的意思是在一个作用域内(命名空间内)定义了某个或某些具有相同名称的函数,但是他们的参数列表和定义(实现)不相同,如果相同的话,就没啥意义了。当调用一个重载函数时,编译器会通过所使用的参数类型、个数等与定义中的参数类型进行比较,决定选用最合适的定义,这个选择重载函数的过程就是重载决策。

比如我们可以在定义的类中、在某一个命名空间内使用函数重载:

#include <iostream>
#include<stdlib.h>
using namespace std;
//类内的函数重载
class Line
{
public:
void setLength( double len );
void setLength(int len);
double getLength( void );
Line(); private:
double length;
}; // 成员函数定义,包括构造函数
Line::Line(void)
{
cout << "Object is being created" << endl;
} void Line::setLength( double len )
{
length = len;
}
void Line::setLength( int len )
{
length = len+;
}
double Line::getLength( void )
{
return length;
}
//在std命名空间的函数重载,求两个数的和
int add(int x, int y)
{
return x+y;
}
int add(double x, double y)
{
return x+y;
}
int main( )
{
Line line;
line.setLength(6.0);
cout << "Length of line : " << line.getLength() <<endl;
line.setLength();
cout << "Length of line : " << line.getLength() <<endl;
double a=add(3.0,4.0);
int b=add(,);
cout<<"a="<<a<<" "<<"b="<<b<<endl;
system("pause");
return ;
}

执行上述代码,可以清晰地看到函数重载的现象,其实函数重载本身比较容易理解,但是其经常和函数模板一起使用,这是我遇到过的最普遍的情况,在介绍之前,我们先来了解一下命名空间namespace的用法,从学习c++开始,都知道std,但其实namespace也有很多,例如using namespace cv; using namespace caffe等等,因此我们要说明一下,而刚好函数重载就是在某一个作用域内发生的行为,即不同的命名空间即使函数名,形参都一样也没问题,不属于函数重载。

namespace 的基本格式如下:

namespace identifier

{

entities;

}

此处举个例子:

namespace adding

{

int a,b,c;

c=a+b;

}

为了在namespace外使用某个namespace内的变量或者成员函数时,当然要使用::操作符,如:

adding::a;

函数模板

在上面的例子中,我们为了求两个数的和,因为类型不一样,因此我们针对两个类型写了两个可谓一模一样的函数,重复工作量大,当然我们也不可能预先穷尽所有的可能,不利于项目的维护和发展。c++模板应运而生,模板是泛型编程的基础,即以一种独立于任何特定类型的方式编写代码。

函数模板(function template)是一个独立于类型的函数,这些函数与类型无关,并且只在实例化时才知道其类型,从而形成“批量型”的编程方式。显然应用函数模板可以解决上述问题。

函数模板的定义:

template<模板形参列表>函数的返回值类型 函数名(形式参数列表)

{

函数体

}

模板定义以关键字template开始,后接模板形参列表;模板形参列表-是一对尖括号<>括起来的一个或多个模板形参表且不允许为空。

形参之间以逗号隔开,有两种形式:

  1. typename 参数1,typename 参数2....
  2. class 参数1,class 参数2.....

模板定义的后面就是函数定义,在函数定义中,可以使用模板形参表中的类型参数,例如:

template<typename T> int add(T a,T A b)

{

return a+b;

}

两个语句分开较为正式:

template<typename T>

int add(T a,T A b)

{

return a+b;

}

#include<iostream>
#include<stdlib.h>
using namespace std;
template<typename T>
int add(T a,T b) { return a+b; } int main() {
cout<<"int "<<add(,)<<endl;
cout<<"char "<<add('a','A')<<endl;
system("pause");
return ;
}

类模板

类模板的定义

template<模板参数列表>class 类模板名{

1--构造函数

2--析构函数

3--成员函数

4--数据成员

};

类模板必须以关键字template开头,后接模板形参列表,模板参数用一对<>括住且不允许为空,形参之间以逗号分隔。如果说类是对象的抽象,对象是类的实例,则类模板是类的抽象,类是模板的实例。可以利用类模板建立支持各种数据类型的类。

        template<class T>
class Point{
public:
//默认构造函数
Point():x(),y(){}
//带参数的构造函数
Point(const T a,const T b):x(a),y(b){}
//成员函数 void display(){
cout<<"x:"<<x<<" "<<"y:"<<y<<endl;
}
private:
T x,y;
};

定义完了模板可以在其基础上实例化对象,如上述模板可以初始化为:

Point <int>a,b;//实例化为整形的a和b类,应该执行默认的构造函数
a.display();
b.display();
Point<double>m(3.0,5.0),n(1.0,2.0);//实例化为double类型的m和n类,根据形参个数和类型应该执行带参数的构造函数
m.display();
n.display();

c++程序设计中的函数重载的更多相关文章

  1. C++解析(16):友元与类中的函数重载

    0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...

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

    函数重载是个什么概念,才接触的这个概念的时候我也是完全昏了,还在自己看看了书后就理解了.那什么是函数重载呢?我个人理解的是在同一个作用域下有多个同名的函数,但是他们的形参的类型是不同的,或者参数个数是 ...

  3. 《挑战30天C++入门极限》新手入门:C++中的函数重载

        新手入门:C++中的函数重载 函数重载是用来iostream>  using namespace std;  int test(int a,int b);  float test(flo ...

  4. js中的函数重载

    函数重载与js 什么是函数重载 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,也就是说用 ...

  5. c++中的函数重载、函数重写、函数重定义

    目录 一.函数重载 二.函数重写 三.函数重定义 为了更加深刻的理解 函数重载.重写.重定义,我们可以带着如下这两个问题去思考: 1.子类中是否可以定义父类中的同名成员?为什么? 可以,因为子类与父类 ...

  6. 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)

    本章主要内容: 1)函数重载 2)C++调用C代码 3)new/delete关键字实现动态内存分配 4)namespace命名空间 大家都知道,在生活中,动词和不同的名词搭配一起,意义都会大有不同,比 ...

  7. PHP中实现函数重载

    转载自:http://cnn237111.blog.51cto.com/2359144/1284085 由于PHP是弱类型语言,因此函数的输入参数类型无法确定(可以使用类型暗示,但是类型暗示无法用在诸 ...

  8. C++类中的函数重载

    1,本课程最初阶段就学习了函数重载,但是那时研究目标仅限于全局函数,到目前 为止我们学习了三种函数: 1,全局函数: 2,普通成员函数: 3,静态成员函数: 这三种不同类型的函数之间是否可以构成重载, ...

  9. 从两个角度理解为什么 JS 中没有函数重载

    函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数.类型.顺序)的函数,这组函数被称为重载函数.重载函数通常用来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空 ...

随机推荐

  1. ISCC2018(misc)

    ISCC2018 misc writeup(部分) 这些天做个了iscc题目,有些题目不是很难,网上都有相同的题或者类似的题目,但是我很菜,没做出来多少. #misc1:Where is the FL ...

  2. windows多线程(六) 互斥量Mutex与关键段CriticalSection比较

    一.关键段CS 和 互斥量Mutex 的相同点:都有线程拥有权 关键段和互斥量都有线程拥有权,即可以被一个线程拥有.在 前面讲关键段CS的文章中有说到,关键段结构体的第四个参数保存着拥有该关键段的线程 ...

  3. [转帖]紧急预警:Globelmposter3.0变种来袭,多行业中招

    紧急预警:Globelmposter3.0变种来袭,多行业中招 https://www.csdn.net/article/a/2018-09-04/15959658   CSDN 转载深信服...   ...

  4. C语言版kafka消费者代码运行时异常kafka receive failed disconnected

    https://github.com/edenhill/librdkafka/wiki/Broker-version-compatibility如果使用了broker版本是0.8的话, 在运行例程时需 ...

  5. 【Nginx笔记】 fastcgi_param解释

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径 fastcgi_param QUERY_STRI ...

  6. oracle exp导出加上过滤条件

    exp username/password@dbname   file='d:\hehe.dmp' tables=(%) query="""where UPDATE_DT ...

  7. Virtual Table

    C++对象模型——吴泰 C/C++杂记 C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现 C++ 多继承和虚继承的内存布局 [已翻译100%] (虚继承参考,推荐) 图说C++对象模型:对 ...

  8. 【刷题】BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  9. 【BZOJ4869】【SHOI2017】相逢是问候

    Description BZOJ传送门 Solution 这题涉及到指数嵌套堆叠,可能可以用欧拉函数解决. 试想一个数\(a_i\)经过\(k\)次操作后会变成什么? \[ k个c\;\; \begi ...

  10. BZOJ2800 [Poi2012]Leveling Ground 【扩展欧几里得 + 三分 + 堆】

    题目链接 BZOJ2800 题解 区间加极难操作,差分之后可转化为两点一加一减 那么现在问题就将每个点暂时独立开来 先判定每个点是否被\((A,B)\)整除,否则无解 之后我们先将\(A,B\)化为互 ...