1.編譯過程
hello.cpp程式是進階c語言程式,這種程式易于被人讀懂。為了在系統上運作hello.c程式,每一條c語句都必須轉化為低級的機器指令。然後将這些機器指令打包成可執行目标檔案格式,并以二進制形式存儲于磁盤中。
預處理(Pre-processing) -> 編譯(Compiling) ->彙編(Assembling) -> 連結(Linking)
2. 模闆實作機制
函數模闆機制結論:
- 編譯器并不是把函數模闆處理成能夠處理任何類型的函數
- 函數模闆通過具體類型産生不同的函數
- 編譯器會對函數模闆進行兩次編譯,在聲明的地方對模闆代碼本身進行編譯,在調用的地方對參數替換後的代碼進行編譯。
3. 模闆的局限性
假設有如下模闆函數:
template<class T>
void f(T a, T b)
{ … }
class Person
{
public:
Person(string name, int age)
{
this->mName = name;
this->mAge = age;
}
string mName;
int mAge;
};
//普通交換函數
template <class T>
void mySwap(T &a,T &b)
{
T temp = a;
a = b;
b = temp;
}
//第三代具體化,顯示具體化的原型和定意思以template<>開頭,并通過名稱來指出類型
//具體化優先于正常模闆
template<>void mySwap<Person>(Person &p1, Person &p2)
{
string nameTemp;
int ageTemp;
nameTemp = p1.mName;
p1.mName = p2.mName;
p2.mName = nameTemp;
ageTemp = p1.mAge;
p1.mAge = p2.mAge;
p2.mAge = ageTemp;
}
void test()
{
Person P1("Tom", 10);
Person P2("Jerry", 20);
cout << "P1 Name = " << P1.mName << " P1 Age = " << P1.mAge << endl;
cout << "P2 Name = " << P2.mName << " P2 Age = " << P2.mAge << endl;
mySwap(P1, P2);
cout << "P1 Name = " << P1.mName << " P1 Age = " << P1.mAge << endl;
cout << "P2 Name = " << P2.mName << " P2 Age = " << P2.mAge << endl;
}