C++中模板使用詳解

轉自:http://www.360doc.com/content/09/0403/17/799_3011262.shtml

1.?模板的概念。

我們已經學過重載(Overloading),對重載函數而言,C++的檢查機制能通過函數參數的不同及所屬類的不同。正確的調用重載函數。例如,為求兩個數的最大值,我們定義MAX()函數需要對不同的數據類型分別定義不同重載(Overload)版本。

復制代碼
//函數1.int max(int x,int y);
{return(x>y)?x:y ;}//函數2.
float max( float x,float y){
return (x>y)? x:y ;}//函數3.
double max(double x,double y)
{return (c>y)? x:y ;}
復制代碼

但如果在主函數中,我們分別定義了?char a,b;?那么在執行max(a,b);時 程序就會出錯,因為我們沒有定義char類型的重載版本。

現在,我們再重新審視上述的max()函數,它們都具有同樣的功能,即求兩個數的最大值,能否只寫一套代碼解決這個問題呢?這樣就會避免因重載函數定義不 全面而帶來的調用錯誤。為解決上述問題C++引入模板機制,模板定義:模板就是實現代碼重用機制的一種工具,它可以實現類型參數化,即把類型定義為參數, 從而實現了真正的代碼可重用性。模版可以分為兩類,一個是函數模版,另外一個是類模版。

2.???函數模板的寫法

函數模板的一般形式如下:

Template <class或者也可以用typename T>返回類型 函數名(形參表)
{
    //函數定義體?
}

說明:?template是一個聲明模板的關鍵字,表示聲明一個模板關鍵字class不能省略,如果類型形參多余一個 ,每個形參前都要加class <類型 形參表>可以包含基本數據類型可以包含類類型.

請看以下程序:

復制代碼
//Test.cpp

#include <iostream>using std::cout;using std::endl;
復制代碼

//聲明一個函數模版,用來比較輸入的兩個相同數據類型的參數的大小,class也可以被typename代替,

//T可以被任何字母或者數字代替。

復制代碼
template <class T>T min(T x,T y){ return(x<y)?x:y;}void main( ){int n1=2,n2=10;double d1=1.5,d2=5.6;cout<< "較小整數:"<<min(n1,n2)<<endl;cout<< "較小實數:"<<min(d1,d2)<<endl;system("PAUSE");}
復制代碼

程序運行結果:

?

程序分析:main()函數中定義了兩個整型變量n1 , n2?兩個雙精度類型變量d1 , d2然后調用min( n1, n2);?即實例化函數模板T min(T x, T y)其中T為int型,求出n1,n2中的最小值.同理調用min(d1,d2)時,求出d1,d2中的最小值.

3.?模板?的寫法

定義一個類模板:

Template < class或者也可以用typename T >
class類名
{
//類定義......
};

說明:其中,template是聲明各模板的關鍵字,表示聲明一個模板,模板參數可以是一個,也可以是多個。

例如:定義一個類模板:

復制代碼
// ClassTemplate.h
#ifndef ClassTemplate_HH
#define ClassTemplate_HHtemplate<typename T1,typename T2>class myClass
{
????private:T1 I;T2 J;????public:myClass(T1 a, T2 b);//Constructorvoid show();
};//這是構造函數
//注意這些格式

template <typename T1,typename T2>myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}//這是void show();

template <typename T1,typename T2>void myClass<T1,T2>::show()
{cout<<"I="<<I<<", J="<<J<<endl;
}
#endif// Test.cpp

#include <iostream>
#include "ClassTemplate.h"
using std::cout;
using std::endl;void main()
{myClass<int,int> class1(3,5);class1.show();myClass<int,char> class2(3,'a');class2.show();myClass<double,int> class3(2.9,10);class3.show();system("PAUSE");
}
復制代碼

最后結果顯示:

?

4.非類型模版參數

一般來說,非類型模板參數可以是常整數(包括枚舉)或者指向外部鏈接對象的指針。

那么就是說,浮點數是不行的,指向內部鏈接對象的指針是不行的。

復制代碼
template<typename T, int MAXSIZE>
class Stack
{Private:T elems[MAXSIZE];
…
};Int main()
{Stack<int, 20> int20Stack;Stack<int, 40> int40Stack;
…};
復制代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458409.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458409.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458409.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

騰訊2016春招安全崗筆試題解析

騰訊2016春招安全崗筆試題解析 昨天&#xff08;4月2日&#xff09;晚上7:00到9:00做了騰訊春招安全崗的筆試題。下面解析一下&#xff1a; 題目解析 1 在生成隨機數前用當前時間設置隨機數種子應該是安全的。如果程序用固定的數產生隨機數&#xff0c;其結果也是固定的。如果用…

網絡請求數據解析時,判斷數據是否為空

//判斷是否為空 (BOOL)IsStringEmptyOrNull:(NSString *)str { if (!str) { // null object return true; }else if (str nil){ return true; }else { if ([str isKindOfClass:[NSNull class]]) { return true; …

VS項目屬性的一些配置項的總結(持續增加。。。)

首先&#xff0c;解決方案和項目文件夾包含關系(c項目)&#xff1a; VS解決方案和各個項目文件夾以及解決方案和各個項目對應的配置文件包含關系&#xff1a;假設新建一個項目ssyy&#xff0c;解決方案起名fangan&#xff0c;注意解決方案包括項目&#xff0c;此時生成的最外層…

shell編程中date用法(轉)

原文地址:http://blog.sina.com.cn/s/blog_61c006ea0100mgxe.html 1、date --help %% 輸出%符號 a literal % %a 當前域的星期縮寫 locale’s abbreviated weekday name (Sun..Sat) %A 當前域的星期全寫 locale’s full weekday name, variable length (Sunday..Saturday) %b 當…

linux下搭建FTP服務器

LINUX FTP簡單配置 FTP配置1、#vi /etc/vsftp/vsftpd.conf #主要配置幾個關鍵的就可以 anonymous_enableNO #拒絕匿名訪問 chroot_local_userYES #鎖定用戶目錄&#xff0c…

微信正則表達式 iOS

#pragma mark - 微信號的正則表達式 微信賬號僅支持6-20個字母、數字、下劃線或減號&#xff0c;以字母開頭 (BOOL)isWxNumber:(NSString *)WXNum{ NSString *passWordRegex "^[a-zA-Z][a-zA-Z0-9_-]{5,19}$"; NSPredicate *passWordPredicate [NSPredica…

子元素增加margin-top會增加給父元素的問題

假設我們有如下代碼 <div id"father" style"height:400px;width:400px;background:#e4393c;">     <div id"child" style"background:green;height:100px;width:100px;margin-top:40px;"></div>   </div&g…

Python 關鍵字

from&#xff1a;https://blog.csdn.net/liang19890820/article/details/68488392簡述 關鍵字是預先保留的標識符&#xff0c;每個關鍵字都有特殊的含義。編程語言眾多&#xff0c;但每種語言都有相應的關鍵字&#xff0c;Python 也不例外&#xff0c;它自帶了一個 keyword 模塊…

Zend Studio使用教程之升級Zend Studio(1/3)

2019獨角獸企業重金招聘Python工程師標準>>> Zend Studio是新一代的專業級智能PHP IDE&#xff0c;它旨在幫助開發人員提高工作效率&#xff0c;創造出高品質的PHP應用程序&#xff01;它包含了PHP開發所必須的部件&#xff0c;通過一整套的編輯、調試、分析、優化和…

身份證正則表達式

#pragma mark - 身份證的正則表達式 (BOOL)checkUserID:(NSString *)userID { //長度不為18的都排除掉 if (userID.length!18) { return NO; } //校驗格式 NSString *regex2 "^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d…

java中可重入鎖的學習總結

2019獨角獸企業重金招聘Python工程師標準>>> 經常看到網上的人說&#xff0c;可重入鎖一詞&#xff0c;但是總是沒怎么了解&#xff0c;到底什么是可重入鎖&#xff0c;一直是一個模糊的概念&#xff0c;下面來大致總結一下。 可重入鎖&#xff1a;指的是同一個線程…

Oracle DB優化

http://www.jb51.net/article/77876.htm http://www.jb51.net/article/56881.htm http://danni505.blog.51cto.com/15547/1163711/ http://blog.csdn.net/giianhui/article/details/8172786轉載于:https://www.cnblogs.com/diyunpeng/p/5132392.html

設置View單個圓角

#pragma mark - 設置View單個圓角 (void)addCornerWithView:(UIView *)aView type:(UIRectCorner)aCorners size:(CGSize)aSize { // 根據矩形畫帶圓角的曲線 UIBezierPath *maskPath [UIBezierPath bezierPathWithRoundedRect:aView.bounds byRoundingCorners:aCorn…

Python 數據類型

簡述Python 中的每個值都有一個數據類型。在 Python 編程中&#xff0c;一切&#xff08;萬物&#xff09;皆對象&#xff0c;數據類型實際上是類&#xff0c;變量是這些類的實例&#xff08;對象&#xff09;。簡述數據類型Number數字String字符串List列表Tuple元組Set集合Dic…

基于用戶投票的排名算法(一):Delicious和Hacker News

互聯網的出現&#xff0c;意味著"信息大爆炸"。 用戶擔心的&#xff0c;不再是信息太少&#xff0c;而是信息太多。如何從大量信息之中&#xff0c;快速有效地找出最重要的內容&#xff0c;成了互聯網的一大核心問題。 各種各樣的排名算法&#xff0c;是目前過濾信息…

iOS 修改工程名

一兩個月之前&#xff0c;公司要求將現在的項目&#xff08;發貨端和接單端在一個項目里&#xff09;&#xff0c;拆分成兩個項目分別是接單端項目和發貨端項目&#xff0c;原有的項目還不能下架。這種情況就要考慮蘋果審核查代碼的重復率的問題了。老板的要求除了改變項目的主…

Windows 下 Python 環境搭建

簡述Python 是跨平臺的&#xff0c;可以運行在 Windows、Mac OS X 和各種 Linux/Unix 系統上。在學習 Python 之前&#xff0c;首先要搭建 Python 環境。完成后&#xff0c;會得到 Python 解釋器&#xff08;負責運行 Python 程序的&#xff09;&#xff0c;一個命令行交互環境…

面試中關于Java你所需知道的的一切

本篇文章會對面試中常遇到的Java技術點進行全面深入的總結&#xff0c;幫助我們在面試中更加得心應手&#xff0c;不參加面試的同學也能夠借此機會梳理一下自己的知識體系&#xff0c;進行查漏補缺。 1. Java中的原始數據類型都有哪些&#xff0c;它們的大小及對應的封裝類是什…

利用BBRSACryptor實現iOS端的RSA加解密

背景 RSA這種非對稱加密被廣泛的運用于網絡數據的傳輸&#xff0c;但其在iOS上很難直接實現&#xff0c;BBRSACryptor框架通過移植openssl實現了iOS端的RSA&#xff0c;本文將介紹如何使用BBRSACryptor生成證書&#xff0c;加載公鑰&#xff0c;以及后端如何用php讀取證書&…

UIView轉UIimage

/** 將 UIView 轉換成 UIImage param view 將要轉換的View return 新生成的 UIImage 對象 */ - (UIImage *)yj_convertCreateImageWithUIView:(UIView *)view{ UIGraphicsBeginImageContext(view.bounds.size); CGContextRef ctx UIGraphicsGetCurrentContext…