函数的重载与函数模板

函数重载:

有时候想要实现几个功能相近,但只是处理的参数类型不同的函数,在C语言里我们要把这些函数起上不同的名字,而在C++里我们可以把这些函数都给上一个函数名只需要把不同的参数给入函数就可以了,这样大大的减少了函数名的数量,增强了代码的可读性。

C++中这叫做函数的重载,是在同一作用域内声明几个功能类似的同名函数,但是这些函数必须是参数类型和数量必须不同。调用时,编译器会自动匹配参数最相符的函数,这样就可以实现一个运算符完成不同的运算功能。

示例代码

void print(int i)
{
    cout << i << endl;
}

void print(char s) 
{
    cout << s << endl;
}

int main()
{
    int i = 0;
    char c = 'x';
    print(i);
    print(c);
    return 0;
}

上述代码输出结果

函数重载

函数模板:

函数模板简单来说就是建立一个通用的函数,这个函数的返回值类型和参数类型都是未知的。这个通用函数就是函数模板。函数模板的出现就是为了解决当要实现几个功能相同只是参数的类型不同的运算时要定义多个函数的问题。当函数调用时编译器会根据实参的类型来取代模板中的类型,实现不同类型的运算。函数重载一样是为了减少代码的冗余,提高代码的可读性。

示例代码

template<class A>//class A 为模板类
void print(A a)
{//通用函数的定义
    cout << a << endl;
}

int main()
{
    int i = 0;
    char c = 'x';
    print(i);
    print(c);
    return 0;
}

代码运行结果和函数重载的结果一样。

函数模板的特化:

编译器认为,对于特定的类型,如果程序员能够对函数进行更好的实现,那么就应该执行你实现的版本。所以函数模板的特化就出现了,他是在你给定的模板中给入指定类型参数,当函数被调用时检测到有与实参相匹配的特化过的函数模板,就会优先调用。

特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。但是C++中规定函数模板只能全特化,不支持偏特化。原因可能是应因为偏特化通过重载就能实现。

示例

template<class A,class B>//函数模板
void print(A a,B b)
{
    cout << a << b << endl;
}

template<>//全特化
void print<int,char>(int a,char c)
{
    cout << a << c << endl;
}

//template<class A>//偏特化
//void print<A,char>(A a,char c)
//{//无法通过编译
//  cout << c << a << endl;
//}


int main()
{
    int i = 0;
    char c = 'x';
    print(i,c);
    print(i,c);
    return 0;
}

函数重载和函数模板的区别

函数重载和函数模板都可以实现一个函数名的多用,将功能相近的函数用一个函数名来定义。但是函数重载在实现的时候依然要把函数一一的实现,而函数模板就可以简化这个过程,只需给出一个模板就完成所有的定义。不过在函数要实现不同类型进行不同操作的时候函数重载就可以发挥它灵活多变的特点。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值