前言
重载(overload)和覆盖(override)是C++中关于函数的两个基础概念,但是如果让你说出他们具体的描述和区别,一下子还真是不太容易说的很清楚和全面,这里简单把记录一下,作为备忘。关于隐藏我觉得是个误解,C++中根本没有隐藏的说法和规则。
重载
重载(overload)是指同一个作用域内几个函数名字相同,但形参列表不同(包括参数个数、类型、参数顺序)。注意:函数返回值不是作为区分重载函数的标志。
定义重载函数
定义以下几个函数:
void print(const char *cp);
void print(const int *beg, const int *end);
void print(const int ia[], size_t size);
这些函数的名字一样,形参个数和类型不一样。当调用这些函数时,编译器会根据传递的实参类型推断调用的是哪个函数:
int ary[2] = {0, 1};
print("Hello world"); // 调用print(const char *)
print(j, end(ary) - begin(ary));// 调用print(const int, size_t)
print(begin(ary), end(ary)); // 调用print(const int *, const int *)
两个函数除了返回类型不同,其他所有要素都相同的话,第二个函数的声明是错误的,例如:
void print(const char *cp);
bool print(const char *cp); // 错误
判断两个形参的类型是否相异
有些函数的形参列表看起来不一样,实际上是一样的:
Record lookup(const Account &acct);
Record lookup(const Account&);
typedef Phone Telno;
Record lookup(const Phone&);
Record lookup(const Telno&);
第一对声明中,在函数的声明中形参没有实质的含义,有没有它不会影响形参列表的内容。
第二对声明,typedef是已存在的类型提供了另外一个名字,并不创建新的类型,因此,第二对中两个函数本质上没有不同。
重载和const形参
顶层const(top-level const) 底层const(low-level const)
-- 顶层const和底层const的概念参见《C++ Primer》第五版 2.4.3小节
顶层const不影响传入函数的对象。一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来。
Record lookup(Phone);
Record lookup(const Phone); // 重复声明
Record lookup(Phone*);
Record lookup(Phone* const); // 重复声明
上面两组函数声明,每一组的两个都是等价的。
Record lookup(Accout&);