相當(dāng)于函數(shù)重載的進(jìn)階,類型參數(shù)化
數(shù)據(jù)的類型也可以通過參數(shù)傳遞
在函數(shù)定義時可以不指明具體的數(shù)據(jù)類型,當(dāng)發(fā)生函數(shù)調(diào)用時,編譯器根據(jù)傳入的實參自行推斷數(shù)據(jù)類型,相當(dāng)于類型參數(shù)化
函數(shù)模板
建立一個通用函數(shù),用到的數(shù)據(jù)類型(返回值、形參類型、局部變量類型)無需具體指定,用一個標(biāo)識符來站位,等發(fā)生函數(shù)調(diào)用時再根據(jù)傳入的實參來逆推出真正的類型
一旦定義類函數(shù)模板,就可以將類型參數(shù) 用于函數(shù)定義和函數(shù)聲明,(將內(nèi)置類型的地方,用類型參數(shù)來代替)
template
函數(shù)模板關(guān)鍵字<>
占位符typename T
聲明具體的類型參數(shù),類型參數(shù)是T
template
模板頭,模板頭中包含的類型參數(shù)可以用在函數(shù)定義的各個位置,包括返回值、形參列表和函數(shù)體
#includeusing namespace std;
templateT mmax(T a,T b);
templatevoid swap(T *a,T *b) // templatevoid swap(T *a,T *b) 也是可以的
{T temp=*a;
*a=*b;
*b=temp;
}
template// 可換行,但不能有分號
T mmax(T a,T b)
{if (a>=b)
return a;
else
return b;
}
int main()
{int a=10,b=20;
swap(&a,&b);
cout<
類模板類模板中定義的類型參數(shù)可以在類聲明和類定義中
templateclass MyPoint
{private:
T1 x;
T2 y;
public:
MyPoint(T1 x,T2 y);
void setx(T1 x);
T1 getx() const;
void sety(T2 y);
T2 gety() const; // const 成員函數(shù) 不能修改成員this的成員值
MyPoint *print() const;
};
templateMyPoint::MyPoint(T1 x,T2 y)
{this->x=x;
this->y=y;
}
templatevoid MyPoint::setx(T1 x)
{this->x=x;
}
templatevoid MyPoint::sety(T2 y)
{this->y=y;
}
templateT1 MyPoint::getx() const
{return this->x;
}
templateT2 MyPoint::gety() const
{return this->y;
}
templateMyPoint* MyPoint::print() const
{return new MyPoint(this->x,this->y);
}
int main()
{// 創(chuàng)建對象
MyPointp1(1,2);
MyPointp2(3.,4.);
MyPointp3(5,"lisi");
// 創(chuàng)建對象
MyPoint*p4=new MyPoint(6,7);
// 接收返回值
MyPoint*point_ptr=p1.print();
cout<getx()<<" "<gety()<*point_ptr2=p2.print();
cout<getx()<<" "<gety()<
例子2 !!!
#includeusing namespace std;
templateclass List
{private:
int length; // 數(shù)組個數(shù)
T *ptr; //數(shù)組指針
public:
List(int length);
List(List &arr); // 構(gòu)造函數(shù)重載
~List();
void push_back(const T &v); // 添加元素
// List & operator=(const List &a); // 數(shù)組見賦值, 成員函數(shù),返回的是引用
T size();
T & operator[](int idx); // 成員函數(shù),返回的是引用
};
templateList::List(int length)
{this->length=length;
if (length==0)
{this->ptr=NULL;
}
else
{this->ptr=new T[this->length]();
}
}
templateList::List(List &arr)
{if (!arr.ptr)
{this->ptr==NULL;
this->length=0;
return ; // 這個也很重要
}
this->ptr=new T[arr.length];
memcpy(this->ptr,arr.ptr,sizeof(T)*arr.length); // 內(nèi)存賦值
this->length=arr.size;
}
templateList::~List()
{if (this->ptr)
{delete[] this->ptr;
}
cout<<"析構(gòu)"<void List::push_back(const T &v)
{if (this->ptr)
{// 注意寫法!??!
T *temp_ptr=new T[this->length+1](); // 重新分配空間
memcpy(temp_ptr,this->ptr,sizeof(T)*this->length); // 拷貝原有數(shù)組;
delete[] this->ptr;
this->ptr=temp_ptr;
}
else
{this->ptr=new T[1]();
}
this->ptr[this->length++]=v;
}
templateT List::size()
{return this->length;
}
templateT & List::operator[](int idx)
{return this->ptr[idx];
}
int main()
{ListL(3);
cout<
模板重載#includeusing namespace std;
templatevoid mswap(T &a,T &b);
templatevoid mswap(T a[],T b[],int len);
templatevoid printArray(T arr[],int len);
int main()
{int a=10,b=20;
cout<1,2,3};
int arr2[3]={4,5,6};
cout<<"******"<void mswap(T &a,T &b)
{T temp=a;
a=b;
b=temp;
}
templatevoid mswap(T a[],T b[],int len)
{T temp;
for (int i=0;itemp=a[i];
a[i]=b[i];
b[i]=temp;
}
}
templatevoid printArray(T arr[],int len)
{for (int i=0;icout<
參數(shù)類型推斷
類型轉(zhuǎn)換templatevoid func(T a, T b);
func(1,2.3); // 錯誤不能進(jìn)行隱式的類型轉(zhuǎn)換,且不知道T應(yīng)該是哪個類型
templatevoid func(T a);
int a[10];
func(a); // T的類型為int *, 會進(jìn)行類型轉(zhuǎn)換
templatevoid func(T &a);
int a[10];
func(a); // 當(dāng)函數(shù)參數(shù)是引用類型時,數(shù)組不會轉(zhuǎn)換為指針,T的類型為int [10]
注意
當(dāng)顯示指明類型參數(shù)時,可以進(jìn)行類型轉(zhuǎn)換(隱式)
templatevoid func(T a, T b);
func(1,2.3); // 正確的
顯示指明// 函數(shù)調(diào)用過程中只能推斷出T1 不能推斷出 T2,所以必須顯示指明
templatefunc(T1 a)
{T2 b;
}
// 顯示指明是,是按順序指明的
func(10)
模板進(jìn)階 – 還沒看7.6
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前標(biāo)題:c++-模板-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://jinyejixie.com/article34/pegpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、軟件開發(fā)、響應(yīng)式網(wǎng)站、自適應(yīng)網(wǎng)站、App開發(fā)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容