C++模板-31-普通函数和模板函数的区别

前面学习了使用函数模板来实现一个数组排序的例子,基本上体会到了函数模板的好处,就是针对参数类型会自动推导,减少了重复代码。那么函数模板和普通的函数有什么区别呢,本篇来学习这个。

1.普通函数调用时可以发生自动类型转换

下面来举例一个简单的加法普通函数,看看怎么发生的自动类型转换

#include <iostream>
using namespace std;

//普通函数
int myAdd(int a, int b)
{
    return a + b;
}


void test01()
{
    int a = 10;
    int b = 20;

    cout << myAdd(a, b) << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}

这个普通函数调用,两个参数a和b都是Int类型,这里没有发生类型自动转换。如果改成一个int 一个 char类型呢

#include <iostream>
using namespace std;

//普通函数
int myAdd(int a, int b)
{
    return a + b;
}


void test01()
{
    int a = 10;
    char b = 'c';

    cout << myAdd(a, b) << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}

运行代码依然可以输出结果是 109

因为小写字母c对应ASCII码表是99(小写字母a是97),这里发生类型自动转换,10+99 = 109, 把参数char b 提升类型为int

 

2.函数模板调用时,如果利用自动类型推导,不会发生类型转换

写一个模板函数,实现两个参数相加

#include <iostream>
using namespace std;

//模板函数
template <class T>
T myAdd(T a, T b)
{
    return a + b;
}


void test01()
{
    int a = 10;
    int b = 20;

    cout << myAdd(a, b) << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}

这里就使用了自动类型推导,传入的两个参数都是int类型,所以自动类型推导也是int类型。如果两个参数类型不一样,就无法自动推导,会报错。

 

3.如果利用显示类型的指定方式,可以发生隐式类型转换

在上面函数模板中使用自动类型推导,无法解决参数类型不一致。其实有一种显式指定参数类型可以解决该问题,代码如下,注意下面17行<int>, 这个就是显式告诉编译器类型为int,如果有参数不是该类型,就自动发生隐式类型转换,当然是在支持转换的范围内。

#include <iostream>
using namespace std;

//模板函数
template <class T>
T myAdd(T a, T b)
{
    return a + b;
}


void test01()
{
    int a = 10;
    char b = 'c';

    cout << myAdd<int>(a, b) << endl;
}

int main()
{
    test01();
    system("pause");
    return 0;
}

这个可以编译,运行得到结果109

以上三点就是普通函数和函数模板的区别,最主要的区别就是能不能发生类型自动转换。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章