在线二区人妖系列_国产亚洲欧美日韩在线一区_国产一级婬片视频免费看_精品少妇一区二区三区在线

鍍金池/ 教程/ C/ 模板
動態(tài)內(nèi)存
類和對象
接口 (抽象類)
結(jié)構(gòu)體
循環(huán)的類型
函數(shù)
數(shù)字
日期和時間
基本語法
多態(tài)
數(shù)據(jù)抽象
注釋
命名空間
字符串
預(yù)處理器
決策語句
修飾符的類型
鍙橀噺綾誨瀷
基本輸入輸出
操作符
數(shù)組
模板
多線程
繼承
Web 編程
信號處理
指針
存儲類型
概述
引用
常量
異常處理
開發(fā)環(huán)境
重載
變量作用域
數(shù)據(jù)類型
數(shù)據(jù)封裝
文件和流

模板

模板是泛型編程的基礎(chǔ)。泛型編程就是以獨(dú)立于任何特定類型的方式編寫代碼。

模板是創(chuàng)建泛型類或函數(shù)的藍(lán)圖或公式。

使用模板的概念開發(fā)的庫容器,像迭代器和算法都是泛型編程的例子。

每個容器都有一個單一定義,例如 vector,但我們也可以定義許多不同類型的 vector,如 vector <int>vector <string> 。

你也可以使用模板定義函數(shù)和類,讓我們看看是怎么做的:

函數(shù)模板

模板函數(shù)定義的一般形式如下所示:

    template <class type> ret-type func-name(parameter list)
    {
       // body of function
    }

這里的 type 是函數(shù)使用的數(shù)據(jù)類型的占位符名稱。 這個名稱可以在函數(shù)定義內(nèi)使用。

下面是一個返回兩個值中的最大值的函數(shù)模板例子:

    #include <iostream>
    #include <string>

    using namespace std;

    template <typename T>
    inline T const& Max (T const& a, T const& b) 
    { 
    return a < b ? b:a; 
    } 
    int main ()
    {

    int i = 39;
    int j = 20;
    cout << "Max(i, j): " << Max(i, j) << endl; 

    double f1 = 13.5; 
    double f2 = 20.7; 
    cout << "Max(f1, f2): " << Max(f1, f2) << endl; 

    string s1 = "Hello"; 
    string s2 = "World"; 
    cout << "Max(s1, s2): " << Max(s1, s2) << endl; 

       return 0;
    }

如果我們編譯并運(yùn)行上述代碼,將會產(chǎn)生以下結(jié)果:

    Max(i, j): 39
    Max(f1, f2): 20.7
    Max(s1, s2): World

類模板

就像我們可以定義函數(shù)模板一樣,我們也可以定義類模板。

模板類定義的一般形式如下所示:

    template <class type> class class-name {
    .
    .
    .
    }

這里的 type 是一個類型的占位符名稱,當(dāng)類實例化的時候,此類型會被指定。 你可以用一個逗號隔開的列表定義多個泛型數(shù)據(jù)類型。

以下是一個定義Stack<>類并實現(xiàn)泛型方法來壓入和彈出堆棧元素的例子:

    #include <iostream>
    #include <vector>
    #include <cstdlib>
    #include <string>
    #include <stdexcept>

    using namespace std;

    template <class T>
    class Stack { 
      private: 
    vector<T> elems; // elements 

      public: 
    void push(T const&);  // push element 
    void pop();   // pop element 
    T top() const;// return top element 
    bool empty() const{   // return true if empty.
    return elems.empty(); 
    } 
    }; 

    template <class T>
    void Stack<T>::push (T const& elem) 
    { 
    // append copy of passed element 
    elems.push_back(elem);
    } 

    template <class T>
    void Stack<T>::pop () 
    { 
    if (elems.empty()) { 
    throw out_of_range("Stack<>::pop(): empty stack"); 
    }
        // remove last element 
    elems.pop_back(); 
    } 

    template <class T>
    T Stack<T>::top () const 
    { 
    if (elems.empty()) { 
    throw out_of_range("Stack<>::top(): empty stack"); 
    }
        // return copy of last element 
    return elems.back();  
    } 

    int main() 
    { 
    try { 
    Stack<int> intStack;  // stack of ints 
    Stack<string> stringStack;// stack of strings 

    // manipulate int stack 
    intStack.push(7); 
    cout << intStack.top() <<endl; 

    // manipulate string stack 
    stringStack.push("hello"); 
    cout << stringStack.top() << std::endl; 
    stringStack.pop(); 
    stringStack.pop(); 
    } 
    catch (exception const& ex) { 
    cerr << "Exception: " << ex.what() <<endl; 
    return -1;
    } 
    }

如果我們編譯并運(yùn)行上述代碼,將會產(chǎn)生以下結(jié)果:

    7
    hello
    Exception: Stack<>::pop(): empty stack
上一篇:循環(huán)的類型下一篇:存儲類型