国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【高級程序設計語言C++】初識模板

這篇具有很好參考價值的文章主要介紹了【高級程序設計語言C++】初識模板。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 函數(shù)模板

概念:

函數(shù)模板代表了一個函數(shù)家族,該函數(shù)模板與類型無關,在使用時被參數(shù)化,根據(jù)實參類型產(chǎn)生函數(shù)的特定類型版本。

具體格式:

template<typename T1, typename T2,…,typename Tn>

返回值類型 函數(shù)名(參數(shù)列表){}

#include <iostream>
using namespace std;
template <class T>
void func(T& num) {
	cout << num << endl;
}
int main() {
	int a = 1;
	double b = 1.2;
	string c = "1.3";
	func(a);
	func(b);
	func(c);
	return 0;
}

輸出結果:

【高級程序設計語言C++】初識模板,c++,開發(fā)語言

typename是用來定義模板參數(shù)關鍵字,也可以使用class(切記:不能使用struct代替class)

函數(shù)模板是一個藍圖,它本身并不是函數(shù),是編譯器用使用方式產(chǎn)生特定具體類型函數(shù)的模具。所以其實模

板就是將本來應該我們做的重復的事情交給了編譯器。

函數(shù)模板的實例化

template <typename T>
void add(const T& a, const T& b) {
	cout << a + b << endl;
}
int main() {
	int a1 = 1, a2 = 2;
	double b1 = 1.2, b2 = 1.3;
	add(a1, a2);
	add(b1, b2);

	//編譯錯誤
	add(a1, b1);
	return 0;
}

【高級程序設計語言C++】初識模板,c++,開發(fā)語言

上面模板參數(shù)列表中只有一個T,編譯器無法確定到底將T確定為int還是double類型,所以報錯。

有兩種處理方法,一是用戶自己強制轉化類型,二是使用顯示實例化。

template <typename T>
void add(const T& a, const T& b) {
	cout << a + b << endl;
}
int main() {
	int a1 = 1, a2 = 2;
	double b1 = 1.2, b2 = 1.3;
	add(a1, a2);
	add(b1, b2);
	add(a1, (int)b1);
	return 0;
}

輸出結果:

【高級程序設計語言C++】初識模板,c++,開發(fā)語言

顯示實例化

顯示實例化就是在函數(shù)名后的<>中指定模板參數(shù)的實際類型。

template <typename T>
void add(const T& a, const T& b) {
	cout << a + b << endl;
}
int main() {
	int a1 = 1, a2 = 2;
	double b1 = 1.2, b2 = 1.3;
	add<int>(a1, b2);
	return 0;
}

輸出結果:

【高級程序設計語言C++】初識模板,c++,開發(fā)語言

要是類型不匹配,編譯器會嘗試進行隱式類型轉換,如果無法轉換成功編譯器將會報錯。

模板參數(shù)的匹配原則

  1. 一個非模板函數(shù)可以和一個同名的函數(shù)模板同時存在,而且該函數(shù)模板還可以被實例化為這個非模板函數(shù)
void add(int a, int b) {
	cout << a + b << endl;
}
template <typename T>
void add(const T& a, const T& b) {
	cout << a + b << endl;
}
int main() {
	int a1 = 1, a2 = 2;
	double b1 = 1.2, b2 = 1.3;
	add(a1, a2);
	add<int>(a1, a2);
	return 0;
}
  1. 對于非模板函數(shù)和同名函數(shù)模板,如果其他條件都相同,在調(diào)動時會優(yōu)先調(diào)用非模板函數(shù)而不會從該模板產(chǎn)生出一個實例。如果模板可以產(chǎn)生一個具有更好匹配的函數(shù), 那么將選擇模板。
void add(int a, int b) {
	cout << a + b << endl;
}
template <typename T>
void add(const T& a, const T& b) {
	cout << a + b << endl;
}
int main() {
	int a1 = 1, a2 = 2;
	double b1 = 1.2, b2 = 1.3;
	add(a1, a2);
	add<int>(a1, b1);
	return 0;
}
  1. 模板函數(shù)不允許自動類型轉換,但普通函數(shù)可以進行自動類型轉換

2. 類模板

類模板的定義格式

template<class T1, class T2, ..., class Tn>
class 類模板名
{
// 類內(nèi)成員定義
};

類模板的實例化

類模板實例化與函數(shù)模板實例化不同,也就是說類模板實例化不支持隱式實例化,**類模板實例化需要在類模板名字后跟<>,然后將實例化的類型放在<>中即可,**類模板名字不是真正的類,而實例化的結果才是真正的類。

3. 非類型模板參數(shù)

模板參數(shù)分類類型形參與非類型形參。

  1. 類型形參即:出現(xiàn)在模板參數(shù)列表中,跟在class或者typename之類的參數(shù)類型名稱。
  2. 非類型形參,就是用一個常量作為類(函數(shù))模板的一個參數(shù),在類(函數(shù))模板中可將該參數(shù)當成常量來用。
const int N = 10;
template<class T>
class array
{
private:
	T a[N];
};
int main()
{
	array<int> a1;
	array<double> a2;
	return 0;
}

上面有兩個數(shù)組,但是我想讓他們的大小各不相同(a1大小為10,a2大小為100),該如何做呢?

template<class T,size_t N = 10>
class array
{
private:
	T a[N];
};
int main()
{
	array<int,10> a1;
	array<double,100> a2;
	return 0;
}

這時候非類型模板參數(shù)就起到了作用。

注意!

  1. 浮點數(shù)、類對象以及字符串是不允許作為非類型模板參數(shù)的。
  2. 非類型的模板參數(shù)必須在編譯期就能確認結果。也就是說你不能在前面定義個變量num,然后傳進去用。

4. 模板的特化

4.1. 函數(shù)模板的特化

template<class T>
bool func(T a, T b)
{
	return a < b;
}
int main()
{
	int a = 1, b = 2;
	char c = 3, d = 0;
	cout << func(a, b) << endl;
	cout << func(c, d) << endl;
	return 0;
}

輸出結果:

【高級程序設計語言C++】初識模板,c++,開發(fā)語言

在大多數(shù)情況下,上述代碼都可以實現(xiàn)想要的結果,但是針對特殊類型,假如是指針類型,該如何做呢?

template<class T>
bool func(T a, T b)
{
	return a < b;
}
int main()
{
	int a = 1, b = 2;
	char c = 3, d = 0;
	cout << func(a, b) << endl;
	cout << func(c, d) << endl;
	cout << func(&a, &b) << endl;
	return 0;
}

輸出結果:

【高級程序設計語言C++】初識模板,c++,開發(fā)語言

此時,就要對模板進行特化。即:在原模板類的基礎上,針對特殊類型所進行特殊化的實現(xiàn)方式。

特化步驟:

  1. 必須要先有一個基礎的函數(shù)模板
  2. 關鍵字template后面接一對空的尖括號<>
  3. 函數(shù)名后跟一對尖括號,尖括號中指定需要特化的類型
  4. 函數(shù)形參表: 必須要和模板函數(shù)的基礎參數(shù)類型完全相同,如果不同編譯器可能會報一些奇怪的錯誤。
template<class T>
bool func(T a, T b)
{
	return a < b;
}
template<>
bool func<int*>(int* a, int* b)
{
	return *a < *b;
}
int main()
{
	int a = 1, b = 2;
	char c = 3, d = 0;
	cout << func(a, b) << endl;
	cout << func(c, d) << endl;
	cout << func(&a, &b) << endl;
	return 0;
}

輸出結果:

【高級程序設計語言C++】初識模板,c++,開發(fā)語言

4.2. 類模板特化

4.2.1. 全特化

template<class T1,class T2>
class test
{
public:
	test()
	{
		cout << "(T1,T2)" << endl;
	}
private:
	T1 a;
	T2 b;
};

template<>
class test<double,float>
{
public:
	test()
	{
		cout << "(double,float)" << endl;
	}
private:
	double a;
	float b;
};

int main()
{
	test<int,int> t1; //調(diào)用基礎的模板
	test<double, float> t2;  //調(diào)用特化的版本
	return 0;
}

全特化就是將模板參數(shù)列表中所有的參數(shù)都確定化

4.2.2. 偏特化

  1. 部分特化
template<class T1,class T2>
class test
{
public:
	test()
	{
		cout << "(T1,T2)" << endl;
	}
private:
	T1 a;
	T2 b;
};

template<class T1>
class test<T1,int>
{
public:
	test()
	{
		cout << "(T1,int)" << endl;
	}
private:
	T1 a;
	int b;
};

int main()
{
	test<int,int> t1;    //調(diào)用基礎的模板
	test<double, int> t2;//調(diào)用特化的模板
	return 0;
}

偏特化并不僅僅是指特化部分參數(shù),而是針對模板參數(shù)更進一步的條件限制所設計出來的一個特化版

本。文章來源地址http://www.zghlxwxcb.cn/news/detail-556475.html

template<class T1,class T2>
class test
{
public:
	test()
	{
		cout << "(T1,T2)" << endl;
	}
private:
	T1 a;
	T2 b;
};


template<class T1, class T2>
class test<T1*,T2*>
{
public:
	test()
	{
		cout << "(T1*,T2*)" << endl;
	}
private:
	T1 a;
	T2 b;
};

int main()
{
	test<int,int> t1;    //調(diào)用基礎的模板
	test<int*, int*> t2; //調(diào)用特化的int*版本
	return 0;
}

到了這里,關于【高級程序設計語言C++】初識模板的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【高級語言程序設計(一)】第 10 章:文件

    【高級語言程序設計(一)】第 10 章:文件

    目錄 一、文件概述 (1)文件定義 (2)文件命名 (3)文件分類 ①?按照文件的內(nèi)容劃分 ②?按照文件的組織形式劃分 ③?按照文件的存儲形式劃分 ④?按照文件的存儲介質(zhì)劃分 (4)文件存取方式 (5)文件系統(tǒng)? 二、文件的打開和關閉函數(shù) (1)文件打開函數(shù) ①??庫函數(shù)

    2024年02月08日
    瀏覽(27)
  • 【NCRE 二級Java語言程序設計01】全國計算機等級考試初識

    【NCRE 二級Java語言程序設計01】全國計算機等級考試初識

    ?? 本專欄主要是分享自己備考全國計算機二級Java語言程序設計所學心得體會、所搜集的資料信息。雖然有 Java 語言相關基礎,但是 Java 桌面編程、Applet 小程序編程根本沒學過,因為咱不是搞這個的呀,學了它們也找不到這方面工作呀。但是對于考二級 Java 的小伙伴來說是必

    2024年02月10日
    瀏覽(17)
  • 【2022級研究生人工智能高級語言程序設計考試說明】

    考試題共包括4道大題: 第一大題:分類和回歸----(7選1) 第二大題:降維和聚類----(6選1) 第三大題:API調(diào)用(課程中學習過的所有云平臺)----(11選1) 第四大題:深度學習項目----(10選1) 題目采取隨機分配方式,請查閱 人工智能高級語言程序設計考試-題目分配表 ,

    2024年02月11日
    瀏覽(99)
  • 南京郵電大學通達學院 高級語言程序設計(C語言) 題庫選擇、填空、讀程序題答案及解析、程序填空答案、編程題答案及代碼作用的概括性說明

    關于概念的問題不做解析,都是死東西,也解析不了 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    2024年02月04日
    瀏覽(31)
  • 【C++ 程序設計】第 1 章:C++ 語言簡介

    【C++ 程序設計】第 1 章:C++ 語言簡介

    目錄 一、C++ 語言的發(fā)展簡史 二、C++ 語言的特點 (1)基本的輸入/輸出 (2)頭文件和命名空間 (3)強制類型轉換運算符? (4)函數(shù)參數(shù)的默認值? (5)引用和函數(shù)參數(shù)的傳遞 ①?引用的定義 ②?引用在函數(shù)中的使用 (6)const 與指針共同使用 (7)內(nèi)聯(lián)函數(shù)? (8)函數(shù)的

    2024年02月07日
    瀏覽(20)
  • C++語言程序設計之類和對象進階(3)

    C++語言程序設計之類和對象進階(3)

    ????????這一部分介紹C++友元函數(shù)、友元類和this指針。 ????????友元函數(shù),可以在類的成員函數(shù)外部直接訪問對象的私有成員。 1.1.1?設計代碼 1.1.2?執(zhí)行結果 圖1?友元函數(shù)代碼執(zhí)行結果

    2024年01月25日
    瀏覽(18)
  • C++語言程序設計第五版 - 鄭莉(第六章課后習題)

    C++語言程序設計第五版 - 鄭莉(第六章課后習題)

    6-20 實現(xiàn)一個名為 SimpleCircle 的簡單圓類。其數(shù)據(jù)成員 int* itsRadius 為一個指向其半徑值的指針,存放其半徑值。設計對數(shù)據(jù)成員的各種操作,給出這個類的完整實現(xiàn)并測試這個類。 6-21 編寫一個函數(shù),統(tǒng)計一條英文句子中字母的個數(shù),在主程序中實現(xiàn)輸入輸出。 6-22 編寫函數(shù)

    2023年04月25日
    瀏覽(21)
  • 【Java高級語法】(十三)注解:解碼程序設計中的元數(shù)據(jù)利器,在小小的@符里挖呀挖呀挖~用小小的注解做強大的開發(fā)...

    【Java高級語法】(十三)注解:解碼程序設計中的元數(shù)據(jù)利器,在小小的@符里挖呀挖呀挖~用小小的注解做強大的開發(fā)...

    Java 注解(Annotation) 是Java語言中一種元數(shù)據(jù)形式,它提供了一種在代碼中添加元數(shù)據(jù)的方式。注解為程序員提供了向代碼中添加額外信息的能力,這些額外信息可以被編譯器、工具或者運行時環(huán)境使用。 優(yōu)點: 提供了一種 更加簡潔和可讀性強 的代碼編寫風格; 增強代碼的

    2024年02月10日
    瀏覽(30)
  • 06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設計(主要的窗體類及其用途;窗體類重要特性設置;多窗口應用程序設計)

    06-3_Qt 5.9 C++開發(fā)指南_多窗體應用程序的設計(主要的窗體類及其用途;窗體類重要特性設置;多窗口應用程序設計)

    常用的窗體基類是QWidget、QDialog 和QMainWindow,在創(chuàng)建 GUI應用程序時選擇窗體基類就是從這 3 個類中選擇。QWidget 直接繼承于 QObject,是 QDialog 和 QMainWindow 的父類,其他繼承于 QWidget 的窗體類還有 QSplashScreen、QMdiSubWindow和QDesktopWidget。另外還有一個類QWindow,它同時從 QObject 和Q

    2024年02月13日
    瀏覽(26)
  • 【Java高級程序設計】注解實驗

    【Java高級程序設計】注解實驗

    @Label注解: person類: ?PersonAction接口: PersonInput類,負責提示錄入人員的相關屬性,提示必須是注解@Label所標注的中文名稱。 PersonDisplay,負責顯示人員信息,顯示時的屬性名稱必須為注解@Label所標注的中文名稱 測試類: 運行結果: @Column注解 Person類: MySqlDAO類: CreateSQL類

    2024年02月07日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包