浅析函数重载
首先说一下函数重载的概念,简单来说就是同名的函数拥有不同个数或类型的形参,编译器会根据实参与形参的类型与个数的最佳匹配自动确定调用哪一个函数。
例:
int add(int x,int y);
float add(float x,float y);
int add(int x,int y,int z);
由于函数的形参类型/个数不同,编译器会自动匹配对应的实参与形参从而确定调用的函数。
下面举一个反例:
int add(int x,int y);
int add(int a,int b);
void add(int x,int y);
该情况下编译器是无法区分这三个函数的,因为编译器不以形参名和返回值来区分函数。
下面我们来看一道题目。
建立一个date 类,相关的数据成员均为整数。它以三种方法重载构造函数date()。①构造函数没有参数,年、月、日数据可由当期日期确定;②构造函数的参数为字符串类型,它接受以字符串形式表示的日期(“yyyy-mm-dd”);③构造函数的参数为三个整数,日期以三个整数的形式被传递。参见如下提示:
class date{ //定义date类
public:
date(char *NewD);
date(int NewY,int NewM,int NewD);
date();
void show();
private:
int y,m,d;
};
int main() //测试date类
{ date d1,d2(2011,3,8),d3("2011-03-19");
d1.show();
d2.show();
d3.show();
return 0;
}
下面给出我的解答。
#include<iostream>
using namespace std;
class date{
public:
date();
date(char *NewD);
date(int NewY,int NewM,int NewD);
void show();
private:
int y,m,d;
};
date::date(char *NewD)
{
y=1000*(NewD[0]-'0')+100*(NewD[1]-'0')+10*(NewD[2]-'0')+(NewD[3]-'0'); //将’2‘、’0‘、’1‘、’1‘字符分别转成整数并变成“2011”这样年的操作就完成了
m=10*(NewD[5]-'0')+(NewD[6]-'0');
d=10*(NewD[8]-'0')+(NewD[9]-'0'); //月和日的操作和年一样,不过注意'-'同样是字符,要记得跳过
}
date::date(int NewY,int NewM,int NewD)
{
y=NewY;
m=NewM;
d=NewD; //将形参的值赋给y、m、d
}
date::date()
{
y=2019;
m=3;
d=21; //直接给y、m、d赋值
}
void date::show()
{
cout<<y<<"-"<<m<<"-"<<d<<endl;
}
int main()
{ date d1,d2(2011,3,8),d3("2011-03-19");
d1.show();
d2.show();
d3.show();
return 0;
}
第一种方法即直接给y、m、d赋值,比较简单,在此我不多赘述。
主要来看第二种方法。我们需要将字符转换成整数来分别给y、m、d来赋值。2==‘2’-‘0’不难想到。*NewD是指针,它指向保存着字符的地址“2011-03-19”就保存在NewD[0]到NewD[9]指向的地址中。接下来我们便逐一把字符转成整数并赋值给y、m、d,问题就解决了。
第三种方法则是以整数形式传递,也比较简单。
函数重载其实并不复杂,它是为了符合人们在给函数命名时的习惯,使函数更方便使用,便于记忆。
这是本人第一篇博客,定有许多不足乃至错误之处,请多包涵,欢迎各位指正。