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
模板與過載的區別
-
從程式碼中我們可以學習到,模板的定義方式一般有兩種,分別為:template < typename T> 或 template 。有人可能會問一個typename和一個class這裡面有什麼區別,其實早期的C++並沒有typename這個關鍵字,所以不論是函式模板還是類模板,都使用class的這種定義方式,後面C++完善,於是多出了typename,用來區分定義的是函式模板還是類模板,但本質都是一樣的。
-
所謂的函式模板,實際上是建立一個通用的函式,其函式的型別和形參的型別不具體指定,用一個虛擬的型別來代表,這個通用的函式就成為函式模板。凡是函式體相同的函式都可以用這個模板來代替,而不必定義多個函式,只需在模板中定義一次就行了,在呼叫函式的時候系統會根據實參的型別來取代模板中的虛擬型別,從而實現了不同函式的功能。
-
相對於函式過載而言,模板具有得天獨厚的優勢,它不需要重複定義,所以使用起來比函式過載更簡潔,但應注意的一點,函式模板只適用於函式的引數個數相同而型別不同,且函式體相同的情況,如果引數的個數不同,則不能用函式模板,這就是函式模板相對於函式過載的缺陷。
一個函式過載的例子如下:
#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++繼承的內存對象模型。主要是讀了讀