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;
}
全部评论

相关推荐

评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务