c++程序设计中的函数重载
函数重载的意思是在一个作用域内(命名空间内)定义了某个或某些具有相同名称的函数,但是他们的参数列表和定义(实现)不相同,如果相同的话,就没啥意义了。当调用一个重载函数时,编译器会通过所使用的参数类型、个数等与定义中的参数类型进行比较,决定选用最合适的定义,这个选择重载函数的过程就是重载决策。
比如我们可以在定义的类中、在某一个命名空间内使用函数重载:
#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开始,后接模板形参列表;模板形参列表-是一对尖括号<>括起来的一个或多个模板形参表且不允许为空。
形参之间以逗号隔开,有两种形式:
- typename 参数1,typename 参数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++程序设计中的函数重载的更多相关文章
- C++解析(16):友元与类中的函数重载
0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...
- 关于在C#中对函数重载理解
函数重载是个什么概念,才接触的这个概念的时候我也是完全昏了,还在自己看看了书后就理解了.那什么是函数重载呢?我个人理解的是在同一个作用域下有多个同名的函数,但是他们的形参的类型是不同的,或者参数个数是 ...
- 《挑战30天C++入门极限》新手入门:C++中的函数重载
新手入门:C++中的函数重载 函数重载是用来iostream> using namespace std; int test(int a,int b); float test(flo ...
- js中的函数重载
函数重载与js 什么是函数重载 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,也就是说用 ...
- c++中的函数重载、函数重写、函数重定义
目录 一.函数重载 二.函数重写 三.函数重定义 为了更加深刻的理解 函数重载.重写.重定义,我们可以带着如下这两个问题去思考: 1.子类中是否可以定义父类中的同名成员?为什么? 可以,因为子类与父类 ...
- 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
本章主要内容: 1)函数重载 2)C++调用C代码 3)new/delete关键字实现动态内存分配 4)namespace命名空间 大家都知道,在生活中,动词和不同的名词搭配一起,意义都会大有不同,比 ...
- PHP中实现函数重载
转载自:http://cnn237111.blog.51cto.com/2359144/1284085 由于PHP是弱类型语言,因此函数的输入参数类型无法确定(可以使用类型暗示,但是类型暗示无法用在诸 ...
- C++类中的函数重载
1,本课程最初阶段就学习了函数重载,但是那时研究目标仅限于全局函数,到目前 为止我们学习了三种函数: 1,全局函数: 2,普通成员函数: 3,静态成员函数: 这三种不同类型的函数之间是否可以构成重载, ...
- 从两个角度理解为什么 JS 中没有函数重载
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数.类型.顺序)的函数,这组函数被称为重载函数.重载函数通常用来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空 ...
随机推荐
- Python学习---日期时间
在Python里面日期时间的功能主要由几个模块提供:time,calendar,datetime,date等 time主要用到的功能函数: #!/usr/bin/python3 # coding:ut ...
- SpringBoot项目部署进阶
一.war包部署 通过“云开发”平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的方式.但是,因为某些原因,软件需求方特别要求用war形式打包,我们该怎么做? 1.项目尚未开 ...
- oracle 11g 从 dmp 文件中导出 sql 代码 的方法.
impdp sys/password full=y dumpfile=bg.dmp nologfile=y sqlfile=bg_dmp.sql 备注: bg.dmp 是 dmp 文件, bg_d ...
- Linux内核设计与实现第十周读书笔记
第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...
- wget递归下载整站
由于线上跑的系统还有CentOS5.4.6.4.6.5.6.5.6.6.6.8,而各镜像站维护的最早的版本已经是6.9,所以需要爬archive站点的rpm包来自建yum仓库. # wget -r - ...
- 遇到问题----gradle-----myeclipse的gradle插件导入项目报错nsupported major.minor version 51.0
装好了gradle插件之后 想要导入gradle类型的项目,然后在 build model的过程中发现: 报错nsupported major.minor version 51.0 查了下发现是jdk ...
- Java考试题之七
QUESTION 150 Click the Exhibit button. Given: ClassA a = new ClassA(); a.methodA(); What is the resu ...
- Java之链表实现栈结构
package com.wzlove.stack; import java.util.Iterator; import java.util.NoSuchElementException; /** * ...
- java关于类加载的面试题
---面试题 class SingleTon { private static SingleTon singleTon = new SingleTon(); public static int cou ...
- 基于excel导入数据到ms sql server
OLE DB (Object Linking and Embedding, Database, sometimes written as OLEDB or OLE-DB) an API designe ...