最近在学习重载函数,所以在这里总结一下:
看到重载二字,我们不由想起几个问题:
什么叫函数重载?为什么要用函数重载?
函数重载为什么不需要考虑返回值类型?
函数重载的条件有哪些?
接下来一一解答:
1、什么叫函数重载,为什么要用函数重载:
函数重载就是在同一作用域内,函数名相同,参数列表不同的几个函数(不要求返回类型);重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
我们这里说在同一作用域内,为什么要强调在同一作用域内呢?
如果局部地声明一个函数,则该函数是屏蔽外层作用域中的同名函数而不是重载。 这就像一般的作用域规则一样,很好理解。
这样一个规则告知了一个事实,即每一个版本的重载函数都应该在同一个作用域中声明。
让我们看一个很有趣的例子。
void print(const string &);
void print (double)
void func(int a)
{
void print(int);
print("value");
print (12.34);
print(a);
}
在这里,后面两个都会调用print(int)函数。
名字查找发生在类型检查之前,这就是作用域的成果!
2、重载函数为什么不考虑返回值类型?
举个例子
int func()
float func()
char func()
void func()
这里有四个函数,如果你用int i =func(); 确实,此时我们是可以区分我们这四个函数的,但是我们有时会这么使用func(), 那么此时编译器该如何识别我们调用的是哪个函数呢?所以我们不能根据安徽之类型的不同来判断函数重载!
3、函数重载的条件有哪些?
之前我们在给出重载定义的时候已经给出了两个条件:那就是函数名相同,参数列表不同
那么第三个条件是什么?其实说是条件,不如说是一种判断是否重载的方法 :
看能不能通过修改形参那来影响实参的值
这也就涉及到了const的使用
首先先说一下const的使用方法:
const:const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
在我们使用const的时候,必须保证编译器不能直接或者间接的修改const修饰的常量的值,也就要求我们不能用普通指针指向一个常量(对于一级指针)。
举个简单的例子:
const int a=10;
int *p=&a;
这就是所谓的定义了一个普通指针指向了一个常量,我们在a的前面加了const,就是将10这个常量给了a,通俗的讲,a就是10,我们之后每次遇到a的时候,编译器都会将a自动替换为10;所以我们再定义一个普通的一级指针指向10的地址。我们知道,常量是不能取地址的,所以上述代码应该是错误的。
const如果在星号左边,那么表示被指物是常量,const如果在星号右边,表示指针自身是常量
如:const int *p //表示被指物是常量,也就是*p是常量,也就是p指向的地址的值是不可改变的
int const * p //虽然const的位置发生了改变,但是仍然位于星号的左边,所以与上面的相同
int * const p //表示指针本身是常量,也就是p的只想不能发生改变
举几个例子:
void func1(int &a) void func1(const int &a) 重载
void func2(int a) void func2(const int a) 重定义
void func3(int *a) void func3(const int * a) 重载
void func4(int *a) void func4(int * const a) 重定义