1. 程式人生 > >C++學習筆記 — 模板

C++學習筆記 — 模板

模板就是實現程式碼重用機制的一種工具,它可以實現型別引數化,即把型別定義為引數, 從而實現了真正的程式碼可重用性。模版可以分為兩類,一個是函式模版,另外一個是類模版。

函式模板

函式模板的一般寫法:

template <class T>
返回型別 函式名(形參表){
//函式主體
}

或者

template <typename T>
返回型別 函式名(形參表){
//函式主體
}

template是一個宣告模板的關鍵字,表明一個模板關鍵字的class或typename不能省略,來看一個具體例子

#include <iostream>
#define SQUARE(X) X*X
using namespace std; inline double square(double x); template <class T> T MinNum(T x, T y){ return (x<y?x:y); } int main() { double a,b,c; int x,y; x = 3; y = 10; a = square(5.0); b = square(2.2+1.1); c = SQUARE(2.2+1.1); cout << a << endl; cout <<
b << endl; cout << c << endl; cout << MinNum(a, b) << endl; cout << MinNum(x, y) << endl; return 0; } inline double square(double x){ return x*x; }

程式分析:程式中定義了雙精度浮點型別變數a,b。 定義了整型變數x,y。在比較大小時同都使用MinNum(T x, T y)函式。例項化MinNum(a,b)是T為double型,例項化MinNum(x,y)時 T為int 型

類模板

類模板的一般形式如下:

Template <class T>
class 類名{
//類定義
}

其中,template是宣告各模板的關鍵字,表示宣告一個模板,模板引數可以是一個,也可以是多個。

例如:定義一個類模板:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>
 
using namespace std;
 
template <class T>
class Stack { 
  private: 
    vector<T> elems;     // 元素 
 
  public: 
    void push(T const&);  // 入棧
    void pop();               // 出棧
    T top() const;            // 返回棧頂元素
    bool empty() const{       // 如果為空則返回真。
        return elems.empty(); 
    } 
}; 
 
template <class T>
void Stack<T>::push (T const& elem) 
{ 
    // 追加傳入元素的副本
    elems.push_back(elem);    
} 
 
template <class T>
void Stack<T>::pop () 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::pop(): empty stack"); 
    }
    // 刪除最後一個元素
    elems.pop_back();         
} 
 
template <class T>
T Stack<T>::top () const 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::top(): empty stack"); 
    }
    // 返回最後一個元素的副本 
    return elems.back();      
} 
 
int main() 
{ 
    try { 
        Stack<int>         intStack;  // int 型別的棧 
        Stack<string> stringStack;    // string 型別的棧 
 
        // 操作 int 型別的棧 
        intStack.push(7); 
        cout << intStack.top() <<endl; 
 
        // 操作 string 型別的棧 
        stringStack.push("hello"); 
        cout << stringStack.top() << std::endl; 
        stringStack.pop(); 
        stringStack.pop(); 
    } 
    catch (exception const& ex) { 
        cerr << "Exception: " << ex.what() <<endl; 
        return -1;
    } 
}

當上門的程式碼被編譯和執行時,產生如下結果

7
hello
Exception: Stack<>::pop(): empty stack

模板與過載的區別

  1. 從程式碼中我們可以學習到,模板的定義方式一般有兩種,分別為:template < typename T> 或 template 。有人可能會問一個typename和一個class這裡面有什麼區別,其實早期的C++並沒有typename這個關鍵字,所以不論是函式模板還是類模板,都使用class的這種定義方式,後面C++完善,於是多出了typename,用來區分定義的是函式模板還是類模板,但本質都是一樣的。

  2. 所謂的函式模板,實際上是建立一個通用的函式,其函式的型別和形參的型別不具體指定,用一個虛擬的型別來代表,這個通用的函式就成為函式模板。凡是函式體相同的函式都可以用這個模板來代替,而不必定義多個函式,只需在模板中定義一次就行了,在呼叫函式的時候系統會根據實參的型別來取代模板中的虛擬型別,從而實現了不同函式的功能。

  3. 相對於函式過載而言,模板具有得天獨厚的優勢,它不需要重複定義,所以使用起來比函式過載更簡潔,但應注意的一點,函式模板只適用於函式的引數個數相同而型別不同,且函式體相同的情況,如果引數的個數不同,則不能用函式模板,這就是函式模板相對於函式過載的缺陷。

一個函式過載的例子如下:

#include <iostream>
using namespace std;
 
class printData
{
   public:
      void print(int i) {
        cout << "整數為: " << i << endl;
      }
 
      void print(double  f) {
        cout << "浮點數為: " << f << endl;
      }
 
      void print(char c[]) {
        cout << "字串為: " << c << endl;
      }
};
 
int main(void)
{
   printData pd;
 
   // 輸出整數
   pd.print(5);
   // 輸出浮點數
   pd.print(500.263);
   // 輸出字串
   char c[] = "Hello C++";
   pd.print(c);
 
   return 0;
}

相關推薦

C++學習筆記 模板 包含編譯模式 分別編譯模式

看起來沒有什麼問題吧,但是你編譯一下,依然報錯。不是麼? error LNK2005: "void __cdecl Work(int)"([email protected]@@[email protected]) already defined in func.obj 又是重定義!!我們

C++學習筆記模板

模板就是實現程式碼重用機制的一種工具,它可以實現型別引數化,即把型別定義為引數, 從而實現了真正的程式碼可重用性。模版可以分為兩類,一個是函式模版,另外一個是類模版。 函式模板 函式模板的一般寫法: template <class T> 返回型別 函

C++學習筆記 — STL標準模板

STL簡介 STL是(tandard Template Library)中文名標準模板庫。從根本上說,STL是一些“容器”的集合,這些“容器”有list,vector,set,map等,STL也是演算法和其他一些元件的集合。這裡的“容器”和演算法的集合指的是世界

北京大學MOOC C++學習筆記(七)函式模板和類模板

函式模板: 交換兩個整型變數的值的Swap函式: void Swap(int & x,int & y) {     int tmp = x;     x = y;     y = tmp; } 交換兩個double型變數的值的Swap函式: void Swa

C++學習筆記模板(一)

模板的概念 模板是實現程式碼複用的一種手段,是C++重要的特徵之一此前在定義函式與類時,必須明確指明其中用到的變數的資料型別。如果需要對不同型別的資料進行相同的處理,就需要重新定義函式或者類。 我們知道函式是一種程式碼複用的方式,通過定義不同的函式實現不同的操作,但是函

c++學習筆記之類模板

類是物件的抽象,類模板是類的抽象。 比較兩個數(不同型別)的大小 在類模板內定義成員函式 #include<iostream> using namespace std; template<class numtype> class compare { public

C++學習筆記--模板

The general form of a template function definition is shown here: 通用的模板函式定義如下所示: template<class

C++學習筆記 -- 迴圈佇列的模板

#include<iostream> #include<cassert> using namespace std; template<class T,int SIZE = 50> class queue { public:queue():

c#學習筆記之Application.DoEvents應用

box nbsp net replace 運算 技術 oop blank 假死 Visual Studio裏的摘要:處理當前在消息隊列中的所有 Windows 消息。 交出CPU控制權,讓系統可以處理隊列中的所有Windows消息 比如在大運算量循環內,加Applicati

[C#學習筆記之異步編程模式2]BeginInvoke和EndInvoke方法 (轉載)

cti otf 函數返回 編程模式 catch 數值 gin 單線程 blog 為什麽要進行異步回調?眾所周知,普通方法運行,是單線程的,如果中途有大型操作(如:讀取大文件,大批量操作數據庫,網絡傳輸等),都會導致方法阻塞,表現在界面上就是,程序卡或者死掉,界面元素不動了,

C++學習筆記

and num 學習 命名 har return ++ ios number 1.代碼如下: #include "stdafx.h"#include <iostream> int _tmain(int argc, _TCHAR* argv[]){ std::co

C#學習筆記(7)——委托

() namespace test task cnblogs [] string 命名空間 program 說明(2017-5-29 22:22:50): 1. 語法:public delegate void mydel();這一句在類外面,命名空間裏面。 2. 專門新建一

C++ 學習筆記】 MFC CEdit

top 註意 hello lac int 生成 屬性對話框 關聯 額外 環境:VS2008 -關聯變量 方法一:在控件上右鍵-變量-CEdit類型變量-輸入變量名。 方法二:添加代碼 頭文件中定義變量CEdit m_edit_fileName;源文件中變量

C++學習筆記之泛型算法

vector ace sort clu 算法 clas uniq bits 有時 先貼個代碼 有時間的再補筆記 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 //模板類在接收

C# 學習筆記 --為啥選擇C#

信息 工程 界面 uid 軟件使用 搜索 printf 慢慢 編程習慣   初學C#,沒有看視頻教程,也沒有C++基礎,只有C基礎、VB基礎。   喜歡VB的快捷,很方便就可以搭建起windows的開發環境,很容易上手。   同樣,喜歡C的簡單,自由。長期寫單片機程序,知道

C#學習筆記(12)——三種方法操作XML

結點 記得 ext 應用程序 eval 資源 特性 pla cells 說明(2017-7-11 16:56:13): 原文地址: C#中常用的幾種讀取XML文件的方法 XML文件是一種常用的文件格式,例如WinForm裏面的app.config以及Web程序中的web.c

C#學習筆記】 IDisposable 接口

數據 在外 source int word 編寫 osi 圖標 不知道 托管資源指的是.NET可以自動進行回收的資源,主要是指托管堆上分配的內存資源。托管資源的回收工作是不需要人工幹預的,有.NET運行庫在合適調用垃圾回收器進行回收。 非托管資源指的是.

C++學習筆記----2.4 C++對象的內存模型

影響 sni 創建 clas esp cheng lac -c 如果 轉載自:http://c.biancheng.NET/cpp/biancheng/view/2995.html點擊打開鏈接 當對象被創建時,編譯器會為每個對象分配內存空間,包括成員變量和成員函數。直觀的認

C++學習筆記----2.4 C++引用在本質上是什麽,它和指針到底有什麽區別

times 數據 添加 eof 相關 參數 副本 span 符號 從概念上講。指針從本質上講就是存放變量地址的一個變量,在邏輯上是獨立的,它可以被改變,包括其所指向的地址的改變和其指向的地址中所存放的數據的改變。 而引用是一個別名,它在邏輯上不是獨立的,它的存在具有依附性,

C++學習筆記----4.5 C++繼承時的對象內存模型

關系 分享 nbsp blank size 關聯 一個 查看 ges 推薦閱讀:http://blog.csdn.net/randyjiawenjie/article/details/6693337 最近研究了一下,C++繼承的內存對象模型。主要是讀了讀