日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++超詳細介紹模板_C 語言

作者:幻荼 ? 更新時間: 2022-08-30 編程語言

定義

函數模板不是一個實在的函數,編譯器不能為其生成可執行代碼。定義函數模板后只是一個對函數功能框架的描述,當它具體執行時,將根據傳遞的實際參數決定其功能。

一個程序一般是經過預處理——>編譯——>匯編——>鏈接。但是因為程序無法知道模板的具體類型(int,double),所以無法進行預處理,也就不能生成可執行代碼。

例子

下面我們來看一個例子

我們在學習c語言的時候,當我們需要交換兩個數,我們是這樣做的

交換整數

void Swap(int & x, int & y)
{
    int tmp = x;
    x = y;
    y = tmp;
}

交換小數

void Swap (double & xr double & y)
{
    double tmp = x;
    x = y;
    y = tmp;
}

我們可以看出,只要類型做了變化,我們就需要重新寫一個幾乎不變的代碼,這是非常不方便的。

那么我們像活字印刷術一樣做一個模板出來讓編譯器根據自行推導類型呢?

于是模板就出現了。

對于上面的情況,我們模板是這樣處理的。

格式

template <class T>
void Swap(T & x, T & y)
{
    T tmp = x;
    x = y;
    y = tmp;
}
template <class T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 3;
	int b = 2;
	Swap(a, b);
	cout << a << endl<< b << endl;
	return 0;
}

template <class 類型參數1, class類型參數2, ...>
返回值類型 ?模板名(形參表)
{
? ? 函數體
}

意識就是說,我們在這里用template定義了一個模板”T”,當我們使用Swap的時候,計算機根據我們a,b(都是int)的類型,推出T應當是int 型。

實際上這個

void Swap(T & x, T & y)

變成了

void Swap (int & x, int & y)

但是需要注意,只有當a,b都是同類型的時候,計算機才能自動推到,如果是不同類型,我們將b換為double類型

template <class T>
void Swap(T & x, T & y)
{
    T tmp = x;
    x = y;
    y = tmp;
}
template <class T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 3;
	double b = 2.5;
	Swap(a, b);
	cout << a << endl<< b << endl;
	return 0;
}

就會出現:

因為兩個數一個int一個double,計算機就不知道給這個T賦int 還是double,這個時候有兩種處理方法

處理方法

第一種隱式實例化:讓編譯器根據實參推演模板參數的實際類型

#include<iostream>
using namespace std;
template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.5;
	Add<int>(a1, d2);//在這個地方前面加<int>,計算機就會默認T為int型
}

第二種顯式實例化:在函數名后的<>中指定模板參數的實際類型

#include<iostream>
using namespace std;
template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.5;
	Add(a1,(int) d2);//此處d2原本是double型,但是我們強制轉換為int之后,兩者的類型都相同,計算機就能自動推導了
}

原文鏈接:https://blog.csdn.net/qq_62718027/article/details/125585597

欄目分類
最近更新