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

以上三點就是普通函數和函數模板的區別,最主要的區別就是能不能發生類型自動轉換。

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