目錄
創(chuàng)新互聯(lián)秉承實現(xiàn)全網(wǎng)價值營銷的理念,以專業(yè)定制企業(yè)官網(wǎng),成都網(wǎng)站建設、做網(wǎng)站,小程序開發(fā),網(wǎng)頁設計制作,移動網(wǎng)站建設,營銷型網(wǎng)站建設幫助傳統(tǒng)企業(yè)實現(xiàn)“互聯(lián)網(wǎng)+”轉型升級專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術人才,對客戶都以感恩的心態(tài)奉獻自己的專業(yè)和所長。模板
模板的特點
函數(shù)模板
前言
函數(shù)模板的使用方式
函數(shù)模板具體案例
使用模板的注意事項
普通函數(shù)與函數(shù)模板間的區(qū)別
具體案例
普通函數(shù)與函數(shù)模板調(diào)用規(guī)則
模板的局限性
具體化模板
類模板
前言
類模板與函數(shù)模板的區(qū)別
類模板中成員函數(shù)創(chuàng)建時機
類模板對象做函數(shù)的參數(shù)
傳入方式
具體案例
類模板與繼承
前言
子類指定具體類型案例
子類不指定具體類型案例
類模板成員函數(shù)的類外實現(xiàn)
類模板分文件編寫
1.直接包含源文件
2.將.h和.cpp文件中的內(nèi)容寫到一起,后將后綴名改為.hpp文件
類模板與友元
模板前言:
概念:模板就是建立通用的模具,大大提高復用性
模板的特點使用模板的目的:提高復用性,將類型參數(shù)化?
函數(shù)模板 前言作用:建立一個通用函數(shù),其函數(shù)返回值類型和形參類型可以不具體制定,用一個虛擬的類型來代表
語法:
//聲明一個模板,告訴編譯器后面代碼中緊跟著的T不要報錯,T是一個通用的數(shù)據(jù)類型
template函數(shù)聲明或函數(shù)定義
解釋:
#define _CRT_SECURE_NO_WARNINGS 1
#includeusing namespace std;
//函數(shù)模板
template//通用交換函數(shù)模板
void mySwap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
void main() {
int a = 10;
int b = 20.0;
//自動類型推導(a和b的數(shù)據(jù)類型會被自動解析)
mySwap(a, b);
cout<< "a:"<< a<< "\tb:"<< b<< endl;
//顯式指定類型(為模板參數(shù))
mySwap(a,b);
cout<< "a:"<< a<< "\tb:"<< b<< endl;
}
使用模板的注意事項普通函數(shù)調(diào)用時可以發(fā)生自動類型轉換(隱式類型轉換);函數(shù)模板調(diào)用時,若利用自動類型推導,則不會發(fā)生隱式類型轉換,但若利用顯式指定類型的方式則可以發(fā)生隱式類型轉換
具體案例#includeusing namespace std;
templateT myAdd(T a, T b) {
return a + b;
}
void main() {
int a = 10;
char c = 'c';
//自動類型推導
//cout<< myAdd(a, c)<< endl;//報錯,參數(shù)類型的指定必須一致,不能自動類型轉換
//隱式指定類型
cout<< myAdd(a, c)<< endl;
//明確說明T的類型為int,傳入的參數(shù)是int類型直接傳,不是int類型則使用隱式類型轉換轉為int類型
}
普通函數(shù)與函數(shù)模板調(diào)用規(guī)則1.若函數(shù)模板與普通函數(shù)都可以調(diào)用,則優(yōu)先調(diào)用普通函數(shù)
void myPrint(int a, int b) {
cout<< "調(diào)用普通函數(shù)"<< endl;
}
templatevoid myPrint(T a, T b) {
cout<< "調(diào)用函數(shù)模板"<< endl;
}
void main() {
int a = 10;
int b = 20;
myPrint(a, b);//調(diào)用普通函數(shù)
}
2.可以通過空模板參數(shù)列表的方式來強制調(diào)用函數(shù)模板
//只寫了函數(shù)聲明,沒寫函數(shù)實現(xiàn)
void myPrint(int a, int b);
templatevoid myPrint(T a, T b) {
cout<< "調(diào)用函數(shù)模板"<< endl;
}
void main() {
int a = 10;
int b = 20;
//通過空模板的參數(shù)列表強制調(diào)用函數(shù)模板
myPrint<>(a, b);
}
3.模板也可以實現(xiàn)函數(shù)重載
templatevoid myPrint(T a, T b) {
cout<< "調(diào)用函數(shù)模板1"<< endl;
}
//重載函數(shù)模板
templatevoid myPrint(T a, T b, T c) {
cout<< "調(diào)用函數(shù)模板2"<< endl;
}
void main() {
int a = 10;
int b = 20;
int c = 30;
//調(diào)用函數(shù)模板1
myPrint(a, b);
//調(diào)用函數(shù)模板2
myPrint(a, b, c);
}
4.如果函數(shù)模板可以產(chǎn)生更好的匹配,則優(yōu)先使用函數(shù)模板
void myPrint(int a, int b) {
cout<< "調(diào)用普通函數(shù)"<< endl;
}
templatevoid myPrint(T a, T b) {
cout<< "調(diào)用函數(shù)模板"<< endl;
}
void main() {
char a = 'a';
char b = 'b';
//調(diào)用函數(shù)模板
myPrint(a, b);
}
注意:若提供了函數(shù)模板,那么最好就不要提供普通函數(shù),否則容易出現(xiàn)二義性
模板的局限性templatevoid func(T a, T b) {
a = b;
}
注意:模板并不是萬能的,該模板函數(shù)有一個局限性,若傳入的a和b是一個數(shù)組,那么就無法實現(xiàn)了
具體化模板class Person {
public:
Person(string name, int age) {
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
templatebool myCompare(T& a, T& b) {
if (a == b) {
return true;
}
else {
return false;
}
}
//利用具體化(template<>)的Person版本來實現(xiàn)代碼,具體化優(yōu)先調(diào)用
template<>bool myCompare(Person & a, Person & b) {
if (a.m_Age == b.m_Age && a.m_Name == b.m_Name) {
return true;
}
else {
return false;
}
}
void main() {
Person p1("Tom", 10);
Person p2("Tom", 10);
bool ret = myCompare(p1, p2);
if (ret) {
cout<< "p1==p2"<< endl;
}
else {
cout<< "p1!=p2"<< endl;
}
}
解釋:模板的類型若為Person類型,那么自動調(diào)用具體化了的方法?
類模板 前言作用:建立一個通用的類,類中的成員,數(shù)據(jù)類型可以不具體指定,用一個虛擬的類型來代表
語法:?
template類
解釋:
1.類模板沒有自動類型推導的使用方式
templateclass Person {
public:
Person(NameType name, AgeType age) {
this->m_Name = name;
this->m_Age = age;
}
NameType m_Name;
AgeType m_Age;
};
void main() {
//類模板的使用(顯式指定類型)
Personp("葉秋", 25);
cout<< "p的name:"<< p.m_Name<< endl<< "p的age:"<< p.m_Age<< endl;
}
2.類模板在模板參數(shù)列表中可以有默認參數(shù)
//int為類模板的默認參數(shù)
templateclass Person {
public:
Person(NameType name, AgeType age) {
this->m_Name = name;
this->m_Age = age;
}
NameType m_Name;
AgeType m_Age;
};
void main() {
//類模板默認參數(shù)的使用
Personp("葉秋", 25);
cout<< "p的name:"<< p.m_Name<< endl<< "p的age:"<< p.m_Age<< endl;
}
類模板中成員函數(shù)創(chuàng)建時機templateclass Person {
public:
Person(NameType name, AgeType age) {
this->m_Name = name;
this->m_Age = age;
}
void showPerson() {
cout<< "姓名:"<< this->m_Name<< "\t年齡:"<< this->m_Age<< endl;
}
NameType m_Name;
AgeType m_Age;
};
//指定傳入類型
void printPerson1(Person&p) {
p.showPerson();
}
//參數(shù)模板化
templatevoid printPerson2(Person&p) {
p.showPerson();
}
//整個類模板化
templatevoid printPerson3(P &p) {
p.showPerson();
}
void main() {
Personp("孫悟空", 100);
printPerson1(p);
printPerson2(p);
printPerson3(p);
}
類模板與繼承
前言templateclass Base {
T m;
};
class Son:public Base{};
子類不指定具體類型案例templateclass Base {
T m;
};
templateclass Son:public Base{};
類模板成員函數(shù)的類外實現(xiàn)templateclass Person {
public:
Person(NameType name, AgeType age);
void showPerson();
NameType m_Name;
AgeType m_Age;
};
//構造函數(shù)的類外實現(xiàn)
templatePerson::Person(NameType name,AgeType age){
this->m_Name = name;
this->m_Age = age;
}
//成員函數(shù)的類外實現(xiàn)
templatevoid Person::showPerson() {
cout<< "姓名:"<< this->m_Name<< "\t年齡:"<< this->m_Age<< endl;
}
注意:類模板中的成員函數(shù)類外實現(xiàn)時需要加上模板的參數(shù)列表
類模板分文件編寫 1.直接包含源文件person.h文件內(nèi)
#pragma once
#includeusing namespace std;
templateclass Person {
public:
Person(NameType name, AgeType age);
void showPerson();
NameType m_Name;
AgeType m_Age;
};
person.cpp文件內(nèi)
#include "person.h"
//構造函數(shù)的類外實現(xiàn)
templatePerson::Person(NameType name, AgeType age) {
this->m_Name = name;
this->m_Age = age;
}
//成員函數(shù)的類外實現(xiàn)
templatevoid Person::showPerson() {
cout<< "姓名:"<< this->m_Name<< "\t年齡:"<< this->m_Age<< endl;
}
執(zhí)行文件內(nèi)
//這里必須包含.cpp文件方可
#include "person.cpp"
void main() {
Personp("lili", 18);
p.showPerson();
}
執(zhí)行文件不可以包含.h文件必須包含.cpp問件原因:類模板中的成員函數(shù)在調(diào)用時才可以創(chuàng)建
2.將.h和.cpp文件中的內(nèi)容寫到一起,后將后綴名改為.hpp文件person.hpp文件內(nèi)
#pragma once
#includeusing namespace std;
templateclass Person {
public:
Person(NameType name, AgeType age);
void showPerson();
NameType m_Name;
AgeType m_Age;
};
//構造函數(shù)的類外實現(xiàn)
templatePerson::Person(NameType name, AgeType age) {
this->m_Name = name;
this->m_Age = age;
}
//成員函數(shù)的類外實現(xiàn)
templatevoid Person::showPerson() {
cout<< "姓名:"<< this->m_Name<< "\t年齡:"<< this->m_Age<< endl;
}
執(zhí)行文件內(nèi)
//這里必須包含.hpp文件
#include "person.hpp"
void main() {
Personp("lili", 18);
p.showPerson();
}
類模板與友元1.全局函數(shù)類內(nèi)實現(xiàn),直接在類內(nèi)聲明友元即可
templateclass Person {
//全局函數(shù)類內(nèi)實現(xiàn)
friend void printPerson(Personp) {
cout<< "姓名:"<< p.m_Name<< "\t年齡:"<< p.m_Age<< endl;
}
public:
Person(T1 name, T2 age) {
this->m_Name = name;
this->m_Age = age;
}
private:
T1 m_Name;
T2 m_Age;
};
void main() {
Personp("lili", 18);
printPerson(p);
}
2.全局函數(shù)類外實現(xiàn),需要讓編譯器知道該全局函數(shù)的存在
//編譯器需要先知道printPerson函數(shù)的存在以及Person類的存在
template< class T1, class T2 >class Person;
templatevoid printPerson(Person< T1, T2 >p) {
cout<< "姓名:"<< p.m_Name<< "\t年齡:"<< p.m_Age<< endl;
}
templateclass Person {
//全局函數(shù)類外實現(xiàn)
//加空模板參數(shù)列表證明他是個模板函數(shù)
//若全局函數(shù)是類外實現(xiàn),需要讓編譯器提前知道這個函數(shù)的存在
friend void printPerson<>(Personp);
public:
Person(T1 name, T2 age) {
this->m_Name = name;
this->m_Age = age;
}
private:
T1 m_Name;
T2 m_Age;
};
void main() {
Personp("lili", 18);
printPerson(p);
}
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁名稱:C++之泛型編程-創(chuàng)新互聯(lián)
本文地址:http://aaarwkj.com/article26/gopcg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、品牌網(wǎng)站制作、網(wǎng)站建設、做網(wǎng)站、建站公司、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容