函数重载

函数重载的关键的函数的参数列表–也称为函数特征标。
如果函数参数数目和/或者参数类型不同,则特征标也不同。

引用重载

#include <iostream>
using namespace std;
void  func(double &r1)
{
    cout << "func1\n";
}

void func(const double &r2)
{
    cout << "func2\n";
}

void func(const double &&r3)
{
    cout << "func2\n";
}

void func(double && r3)
{
    cout << "func3\n";
}

int main()
{
    double x = 5.5;
    func(x);
    const double y = 7.8;
    func(y);
    func(x+y);
}

其中左值引用参数r1与可修改的左值参数匹配;
const左值引用参数r2与可修改的左值参数、const左值参数和右值参数(如两个double之和)匹配;
左值引用参数r3与右值匹配。
其中与r1和r3匹配的参数都与r2匹配。这就带来了一个问题:如果重载使用这三种参数的函数,结构如何?答案是将调用最匹配的版本:
结果

func1
func2
func3

万能引用

针对左值,万能引用等效左值引用;针对右值,等效与右值引用。

#include <iostream>
#include <vector>
using namespace std;


template <class T>
void func1(T &&a)
{
    cout << a << endl;
    printf("func4\n");
}

int main()
{
    double x = 5.5;
    const double y = 7.8;
    func1(456);
    func1(x+y);
    func1(x);
    func1(y);
}
456
func4
13.3
func4
5.5
func4
7.8

类型引用和类型本身

下面会重载编译不会出错

#include <iostream>
using namespace std;

void  func(double &r1)
{
    cout << "func1\n";
}

void func(double r2)
{
    cout << "func2\n";
}

1、当我们这样调用时,编译器无法区分,编译报错

int main()
{
    double x = 5.5;
    func(x);
}
errno.cpp: In function ‘int main()’:
errno.cpp:18:11: error: call of overloaded ‘func(double&)’ is ambiguous
     func(x);
           ^
errno.cpp:4:7: note: candidate: void func(double&)
 void  func(double &r1)
       ^
errno.cpp:9:6: note: candidate: void func(double)
 void func(double r2)

2、这样时,编译通过

int main()
{
    const double x = 5.5;
    func(x);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值