C++ Primer第六章④
C++ Primer
第六章 函数
函数重载
这个东西我很喜欢的。 重载函数(overloaded):同一作用域内的几个函数名字相同且形参列表不同:
//几个重载的函数声明
void print();
void print(int a);
void print(int a, int b);
void print(string a);
为什么要重载而不是直接用另外名字的函数呢?这个主要是为了方便调用者,因为比如,像上面这些函数,它们执行的操作都类似(print打印输出),调用者都只要调用print函数就好,编译器会根据传递的实参类型来推断具体是哪个函数。
main函数不能重载(
还想上天啊
) 再强调一遍:对于重载的函数来说,形参数量或形参类型一定有所不同,不包括返回类型啊少年。
int f();
double f(); //错了,除了返回类型外都相同,不是重载了,再说了,你让编译器怎么办
判断两个形参的类型是否不同
有同学觉得这不是很简单吗?来试试:
int f(int &a);
int f(int &); //一样的函数,只是省略了形参名字,不影响
typedef int let;
void t(int a);
void t(let a); //一样的,类型别名
总之就是别被忽悠了,当然自己应该不会这么傻地去重载这样的。
==const来搞事情了==
重载和const形参
一句话概括:顶层const(本身为常量)重载不行的,会被忽略,什么意思呢,看代码:
int f(int);
int f(const int); //重复声明,顶层const会被忽略
底层const重载是可行的:
int f(int&);
int f(const int&) //重载,常量引用都是底层const
int f(int *a);
int f(const int *a); //重载,指向常量的指针
const_cast和重载:
//返回两个string中较短的那个
const string &shortStr(const string &s1, const string &s2)
{
return s1.size() <= s2.size() ? s1 : s2;
}
这个函数很好用,可以接收常量也可以接收非常量,但它有一个小小的不足,当它就收两个非常量时,我们希望返回的也是非常量,而它还是返回常量引用,所以我们要用const_cast写一个重载的函数:
string &shortStr(string &s1, string &s2)
{
auto &r = shortStr(const_cast<const string>(s1),
const_cast<const string>(s2));
//强制转换s1和s2为const,再调用上面那个shortStr函数
return const_cast<string&>(r);
//去掉常量,返回普通引用
}
这样就好了。
调用重载函数
编译器如何确定调用的是哪个重载函数: 最好的就是找到一个与实参最佳匹配的函数,我们也要尽量保证这一点;其他不好的情况可能是找不到,或者二义调用(就是不知道是哪个,匹配程度差不多),我们要避免这些情况的。
void f(int a){} //一号函数
void f(string a){} //二号函数
int main()
{
f(1); //一号
f(1.5); //一号
f('a'); //二号
vector<int> a = {1} ;
f(a); //报错,无匹配
return 0;
}