您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++中怎么應(yīng)用類模板”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++中怎么應(yīng)用類模板”吧!
一、類模板的引出:
1、在c++中是否能夠?qū)⒎盒偷乃枷霊?yīng)用在類上呢?
我們在前面的兩篇文章里面,對函數(shù)模板有了一個(gè)清楚的認(rèn)識,作為類比學(xué)習(xí),當(dāng)然泛型的思想是可以應(yīng)用到類上的。
2、類模板:
一些類主要用于存儲(chǔ)和組織數(shù)據(jù)元素
類中數(shù)據(jù)組織的方式和數(shù)據(jù)元素的具體類型無關(guān)
如:數(shù)組類,鏈表類,Stack類,Queue類等等
c++中將模板的思想應(yīng)用于類,使得類的實(shí)現(xiàn)不關(guān)注數(shù)據(jù)元素的具體類型,而只關(guān)注類所需要實(shí)現(xiàn)的功能
3、C++中的模板:
以相同的方式處理不同的類型
在類聲明前使用template進(jìn)行標(biāo)識
template < typename T >//T表示泛指類型
class Operator
{
public:
T op(T a , T b);
};
4、類模板的應(yīng)用
只能顯示指定具體類型,無法自動(dòng)推導(dǎo)(我們的函數(shù)模板是可以實(shí)現(xiàn)自動(dòng)推導(dǎo)具體類型的)
//使用具體類型"<Type>"定義對象
Operator<int> op1;
Operator<string> op2;
int i = op1.op(1,2);
string s = op2.op("txp","C++");
聲明的泛指類型T可以出現(xiàn)在類模板的任意地方
編譯器對類模板的處理方式和函數(shù)模板相同
-從類模板通過具體類型產(chǎn)生不同的類
-在聲明的地方對類模板代碼本身進(jìn)行編譯
-在使用的地方對參數(shù)替換后代碼進(jìn)行編譯
代碼實(shí)踐:
#include <iostream>
#include <string>
using namespace std;
template < typename T >
class Operator
{
public:
T add(T a, T b)
{
return a + b;
}
T minus(T a, T b)
{
return a - b;
}
T multiply(T a, T b)
{
return a * b;
}
T divide(T a, T b)
{
return a / b;
}
};
string operator-(string& l, string& r)// 全局函數(shù)方式重載 - 操作符,編譯通過;先類內(nèi)部、再全局
{
return "Minus";
}
int main()
{
Operator<int> op1;
cout << op1.add(1, 2) << endl;
Operator<string> op2; // 第二次使用類模板時(shí)進(jìn)行編譯,但是并不是對所有模板中的函數(shù)進(jìn)行了第二次編譯,是分步編譯的,首先編譯的是構(gòu)造函數(shù),此時(shí)用的是默認(rèn)的,沒有問題,這里編譯通過;
cout << op2.add("Txp", "C++") << endl;
cout << op2.minus("Txp", "C++") << endl; // 如果沒有定義全局的重載 - 操作符的函數(shù)時(shí),字符串相減沒有定義,報(bào)錯(cuò);這里報(bào)錯(cuò)展示出來是為了證明類模板編譯也是經(jīng)過了兩次編譯;這里編譯器針對 minus() 函數(shù)進(jìn)行第二次編譯;定義全局的重載 - 操作符函數(shù)后,打印 Minus ;
return 0;
}
輸出結(jié)果:
root@txp-virtual-machine:/home/txp# ./a.out
3
TxpC++
Minux
5、類模板的工程應(yīng)用
類模板必須在頭文件中定義
類模板不能分開實(shí)現(xiàn)在不同的文件中
類模板外部定義的成員函數(shù)需要加上模板<>聲明
代碼實(shí)踐:
Operator.h頭文件:
#ifndef _OPERATOR_H_
#define _OPERATOR_H_
template < typename T >
class Operator
{
public:
T add(T a, T b);
T minus(T a, T b);
T multiply(T a, T b);
T divide(T a, T b);
};
template < typename T >
T Operator<T>::add(T a, T b)
{
return a + b;
}
template < typename T >
T Operator<T>::minus(T a, T b)
{
return a - b;
}
template < typename T >
T Operator<T>::multiply(T a, T b)
{
return a * b;
}
template < typename T >
T Operator<T>::divide(T a, T b)
{
return a / b;
}
#endif
test.cpp文件:
#include <iostream>
#include <string>
#include "Operator.h"
using namespace std;
int main()
{
Operator<int> op1;
cout << op1.add(1, 2) << endl;
cout << op1.multiply(4, 5) << endl;
cout << op1.minus(5, 6) << endl;
cout << op1.divide(10, 5) << endl;
return 0;
}
輸出結(jié)果:
root@txp-virtual-machine:/home/txp# ./a.out
3
20
-1
2
感謝各位的閱讀,以上就是“C++中怎么應(yīng)用類模板”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C++中怎么應(yīng)用類模板這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。