一、什么是函数的重载
在同一作用域下,几个函数的函数名相同,但其内部的形参列表不同,我们称之为函数的重载,这里的不同不仅仅指形参数量的不同,还包括形参类型的不同。
void print(const char *const_p);
void print(const char *begin,const char *end);
void print(const int *const_p);//这里的三个函数分别演示了函数重载的几种形式
注意:main函数不可以重载
原因如下:
C++中规定,main函数作为函数的入口,且规定只有两种main函数的签名合法:int main(); 和 int main(int argc,char* argv[]);其他的任何对main函数的签名都是不合法的。
二、如何定义重载函数
根据重载函数的定义,我们要保证函数名相同,并保证函数内部的形参列表不同。
void show(int a,int b,double c=10);
void show(int a,double b);
void show(int a);
三个函数名相同,但每个函数的形参列表不同,这就是一种函数的重载。
三、判断两个形参的类型是否相异(即判断函数是否属于重载函数)
引用类型的重载函数
void show(const int&);
void show(const int& a);//这两个函数是一个类型的形参列表,不属于重载函数
//当用typedef定义类型别名时,依然不属于重载函数
typedef A B;//A,B为类型名称
void show(const A&);//省略了形参名
void show(const B&);//形参属于同一类型,不属于重载函数
四、重载与const形参
顶层const和底层const
顶层const
表示任意的对象是常量(对任何数据类型都适用)
底层const
与指针和引用等复合类型的基本类型部分有关,比如说一个指针类型,它的底层const就是指该指针指向的对象的值是一个const常量,不可修改,但该指针指向的位置是可以更改的。
注意:
1、指针类型既可以是顶层const,也可以作为底层const,而其他类型则不具备。
2、声明引用的const都是底层const
const修饰的形参
顶层const修饰的形参
由顶层const修饰的形参无法与未被顶层const修饰的形参区分开来,它并不影响传入函数的对象,只是限制了函数内部对参数值的修改而已,就是说顶层const只是对函数内部的参数有影响,从而无法与未被顶层const修饰的形参区别开来。
void lookup(a);
void lookup(const a);//重复声明
void lookup(int* p);
void lookup(int* const p);
底层const修饰的形参
由底层const修饰的形参会对传入的实参类型进行限制,且要求它是一个常数类型,下面举个例子来方便理解:
1、指针变量的底层const修饰
void lookup(int*);//这里省略了指针的形参名
void lookup(const int*);//这里第一和第二个函数的形参是不同的
//因为底层const修饰的是一个指针指向的常量,它与第一个函数形参的变量属于不同类型,所以形参不同,属于重载的函数
2、引用的底层const修饰(声明引用的const都是底层const)
void lookup(int&);
void lookup(const int&);//同上,这两个函数属于重载函数
标签:const,函数,形参,int,void,C++,重载,Primer
From: https://blog.51cto.com/u_16271511/8711700