最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++類模板與函數(shù)模板基礎(chǔ)詳細(xì)講解

 更新時(shí)間:2022年08月09日 15:34:58   作者:戀戀風(fēng)辰  
C++語言的模板技術(shù)包括函數(shù)模板和類模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類是C++語言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下

函數(shù)模板

當(dāng)我們想要定義一個(gè)可以支持泛型的函數(shù)時(shí),就要采用函數(shù)模板的方式了。所謂泛型就是可以支持多種類型的操作,比如我們定義一個(gè)compare操作,他可以根據(jù)傳遞給他的參數(shù)類型動(dòng)態(tài)調(diào)用對(duì)應(yīng)的函數(shù)版本,實(shí)現(xiàn)多種類型的比較。

template <typename T>
int compare(const T &v1, const T &v2)
{
    if (v1 < v2)
        return -1;
    if (v2 < v1)
        return 1;
    return 0;
}

比較函數(shù)是一個(gè)模板函數(shù),它支持T類型的對(duì)象比較,模板函數(shù)定義的規(guī)則是用template 聲明模板的類型為T,然后用T做參數(shù)即可。

調(diào)用的規(guī)則傳遞實(shí)參就可以了,前提是實(shí)參的類型要支持比較大小,如果是類的類型我們可以重載比較運(yùn)算符。

 int res = compare(3, 4);
    cout << "compare(3,4) res is " << res << endl;
    vector<int> v1 = {1, 3, 5};
    vector<int> v2 = {2, 4};
    res = compare(v1, v2);
    cout << "compare(v1, v2) res is " << res << endl;

我們分別傳遞了int類型和vector類型的參數(shù)作為compare比較的參數(shù)。模板函數(shù)也支持多個(gè)類型,我們可以再定義一個(gè)支持多個(gè)參數(shù)類型的模板函數(shù)

template <typename T, typename U>
int printData(const T &t, const U &u)
{
    cout << "t is " << t << endl;
    cout << "u is " << u << endl;
}

調(diào)用規(guī)則和上邊類似,傳遞兩個(gè)不同類型即可

 printData(3.4, "hello world");

模板函數(shù)也支持非參數(shù)類型,用已知類型定義變量

template <unsigned N, unsigned M>
int compareArray(const char (&p1)[N], const char (&p2)[M])
{
    return strcmp(p1, p2);
}

compareArray的模板里用了已知類型unsigned定義了兩個(gè)變量N和M。

調(diào)用的時(shí)候N和M會(huì)自動(dòng)根據(jù)實(shí)參獲取值

 res = compareArray("hello zack", "nice to meet u");
    cout << "compareArray("
         << "hello zack "
         << ", nice to meet u"
         << ") res is " << res << endl;

M和N就是傳遞的兩個(gè)數(shù)組的長(zhǎng)度。

類模板

我們實(shí)現(xiàn)一個(gè)模板類,使其支持類似vector的操作,包括push_back, empty, back, 以及pop_back,取索引[]操作等。

//定義模板類型的blob
template <typename T>
class Blob
{
public:
    typedef T value_type;
    typedef typename std::vector<T>::size_type size_type;
    //構(gòu)造函數(shù)
    Blob()
    {
        data = make_shared<std::vector<T>>();
    }
    Blob(std::initializer_list<T> il)
    {
        data = make_shared<std::vector<T>>(il);
        // for (const T &m : il)
        // {
        //     data->push_back(m);
        // }
    }
    // Blob 中元素?cái)?shù)目
    size_type size() const { return data->size(); }
    bool empty() const { return data->empty(); }
    //添加和刪除元素
    void push_back(const T &t) { data->push_back(t); }
    //移動(dòng)版本的push_back
    void push_back(const T &&t) { data->push_back(std::move(t)); }
    //刪除元素
    void pop_back();
    //元素訪問
    T &back();
    T &operator[](size_type i);
private:
    std::shared_ptr<std::vector<T>> data;
    //校驗(yàn)數(shù)據(jù)是否有效
    void check(size_type i, const std::string &msg) const;
};

我們?cè)陬愅鈱?shí)現(xiàn)check, pop_back, back, 以及[]操作。

template <typename T>
void Blob<T>::check(size_type i, const std::string &msg) const
{
    if (i >= data->size())
        throw std::out_of_range(msg);
}
template <typename T>
void Blob<T>::pop_back()
{
    if (data->empty())
    {
        return;
    }
    data->pop_back();
}
template <typename T>
T &Blob<T>::back()
{
    return data->back();
}
template <typename T>
T &Blob<T>::operator[](size_type i)
{
    check(i, "index out of range");
    return (*data)[i];
}

每一個(gè)類的成員函數(shù)在類外實(shí)現(xiàn)時(shí)都要聲明template。

類模板的使用如下

void use_classtemp()
{
    Blob<int> ia;
    Blob<int> ia2 = {0, 1, 2, 3, 5};
    Blob<string> ia3 = {"hello ", "zack", "nice"};
    for (size_t i = 0; i < ia2.size(); i++)
    {
        ia2[i] = i * i;
    }
    for (size_t i = 0; i < ia2.size(); i++)
    {
        cout << ia2[i] << endl;
    }
    for (size_t i = 0; i < ia3.size(); i++)
    {
        string_upper(ia3[i]);
    }
    for (size_t i = 0; i < ia3.size(); i++)
    {
        cout << ia3[i] << endl;
    }
    const auto &data = ia3.back();
    cout << data << endl;
    ia3.pop_back();
    const auto &data2 = ia3.back();
    cout << data2 << endl;
}

總結(jié)

源碼鏈接

視頻鏈接

到此這篇關(guān)于C++類模板與函數(shù)模板基礎(chǔ)詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++類模板與函數(shù)模板內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)自行車存放管理系統(tǒng)

    C語言實(shí)現(xiàn)自行車存放管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)自行車存放管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ cin.getline及getline()用法詳解

    C++ cin.getline及getline()用法詳解

    這篇文章主要介紹了C++ cin.getline用法及C++ getline()的兩種用法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • C語言 字符串指針詳解及示例代碼

    C語言 字符串指針詳解及示例代碼

    本文主要介紹C語言 字符串指針,這里整理了詳細(xì)資料,并附示例代碼及實(shí)現(xiàn)結(jié)果,有興趣的小伙伴可以參考下
    2016-08-08
  • C++基于EasyX庫實(shí)現(xiàn)拼圖小游戲

    C++基于EasyX庫實(shí)現(xiàn)拼圖小游戲

    這篇文章主要為大家詳細(xì)介紹了C++基于EasyX庫實(shí)現(xiàn)拼圖小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 詳解C++編程中的變量相關(guān)知識(shí)

    詳解C++編程中的變量相關(guān)知識(shí)

    這篇文章主要介紹了詳解C++編程中的變量相關(guān)知識(shí),是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C語言實(shí)現(xiàn)井字棋游戲

    C語言實(shí)現(xiàn)井字棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 利用QT實(shí)現(xiàn)圖片瀏覽器的示例詳解

    利用QT實(shí)現(xiàn)圖片瀏覽器的示例詳解

    這篇文章主要和大家分享一個(gè)小案例:利用QT制作一個(gè)小的圖片瀏覽器,要求可以顯示jpg、jpeg、png、bmp,還可以從電腦上拖動(dòng)圖到窗口并顯示出來,感興趣的可以了解一下
    2023-02-02
  • C++ xxx_cast實(shí)現(xiàn)轉(zhuǎn)換代碼實(shí)例解析

    C++ xxx_cast實(shí)現(xiàn)轉(zhuǎn)換代碼實(shí)例解析

    這篇文章主要介紹了C++xxx_cast轉(zhuǎn)換代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • C語言進(jìn)階練習(xí)二叉樹的遞歸遍歷

    C語言進(jìn)階練習(xí)二叉樹的遞歸遍歷

    樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點(diǎn))按分支關(guān)系組織起來的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會(huì)的族譜和各種社會(huì)組織機(jī)構(gòu)都可用樹形象表示,本篇介紹二叉樹的遞歸與非遞歸遍歷的方法
    2022-06-06
  • 一文學(xué)會(huì)數(shù)據(jù)結(jié)構(gòu)-堆

    一文學(xué)會(huì)數(shù)據(jù)結(jié)構(gòu)-堆

    本文主要介紹了數(shù)據(jù)結(jié)構(gòu)-堆,文中通過圖片和大量的代碼講解的非常詳細(xì),需要學(xué)習(xí)的朋友可以參考下這篇文章,希望可以幫助到你
    2021-08-08

最新評(píng)論

旬阳县| 阜城县| 邵武市| 镇坪县| 华宁县| 韩城市| 云林县| 朔州市| 茶陵县| 汉川市| 鸡西市| 南部县| 明光市| 酒泉市| 沁阳市| 湾仔区| 弥勒县| 台安县| 乐昌市| 新晃| 新化县| 齐齐哈尔市| 西华县| 肃南| 浠水县| 丹棱县| 古蔺县| 景泰县| 进贤县| 绥化市| 潞城市| 玛曲县| 康保县| 西贡区| 广河县| 景宁| 平顺县| 长宁县| 民权县| 图木舒克市| 巴南区|