1.内置函數
調用函數時需要一定的時間和空間的開銷:程式先執行函數調用之前的語句;流程的控制轉移到被調用函數的入口處,同時進行參數傳遞;執行被調用函數中含身體的語句;流程傳回調用函數的下一條指令處,将函數傳回值帶回;接着執行主調函數中未執行的語句。這樣就要求在賺取被調用函數之前,要記下當時執行的指令的位址,還要“保護現場”,以便在函數調用之後繼續執行。在函數調用之後,流程傳回到先前記下的位址處,并且根據記下的資訊“恢複現成”,然後繼續執行,這些都要花費一定的時間。
如果有的函數需要頻繁使用,則所用時間會很長,進而降低程式的執行效率。C++提供一種提高效率的方法,即在編譯時将所調用函數的代碼直接嵌入到主調函數中,而不是将流程轉出去。這種嵌入到主調函數中的函數稱為内置函數,又稱内嵌函數。指定内置函數需要在函數首行左端加關鍵字inline。
#include<iostream>
using namespace std;
inline int max(int a,int b,int c)
{
if(b>a)
{
a = b;
}
if(c>a)
{
a = c;
}
return a;
}
int main(void)
{
int i=10,j=20,k=30,m;
m = max(i,j,k);
cout<<"max="<<m<<endl;
return 0;
}
由于在定義函數時指定它為内置函數,是以編譯系統在遇到函數調用max時,就用函數體的代碼代替,同時将實參代替形參。使用内置函數可以節省運作時間,但卻增加了目标程式的長度。是以隻能在函數規模很小的情況下,函數調用的時間開銷可能相當于甚至超過函數本身的時間,把它定義為内置函數,可大大減少程式運作時間。
PS:内置函數不能包括複雜的控制語句,例如循環和switch語句。
2.函數重載和函數模版
<1>函數重載
函數重載是實作細節不同,同一類功能的操作。
重載函數的參數個人、參數類型或參數順序三者中必須至少有一種不同,函數傳回值類型可以相同也可以不同
<2>函數模版
函數模版可以實作和函數重載相似的功能。所謂函數模版,實際上是建立一個通用函數,其函數類型和形參類型不具體指定,隻用一個虛拟的類型來代表,這個通用函數就是函數模版。凡是函數體相同的函數都可以用這個模版來代替,不必定義多個函數,隻需在模版中定義一次即可。在調用函數時系統會根據實參的類型來取代模闆中的虛拟類型,進而實作不同函數的功能。
#include <iostream>
using namespace std;
template <typename T>//template <class T>
T max(T a, T b ,T c)
{
if(b>a)
{
a = b;
}
if(c>a)
{
a = c;
}
return a;
}
int main(void)
{
int i1=185,i2=-76,i3=567,i;
double d1=56.87,d2=90.23,d3=-3214.78,d;
long g1=67854.g2 =-912456,g3=673456,g
i = max(i1,i2,i3);
d = max(d1,d2,d3);
g = max(g1,g2,g3);
cout<<"i_max="<<i<<endl;
cout<<"d_max="<<i<<endl;
cout<<"g_max="<<i<<endl;
return 0;
}
函數模版隻使用與函數體相同、函數的參數個數相同的而類型不同的情況
3.記憶體管理
C++中的new和delete是運算符,并且保留了malloc和free函數。
new的格式為new int(10)
delete的格式為delete p
#include <iostream>
#include <string>
using namespace std;
structn Student
{
string name;
int num;
char sex;
}
int main()
{
Student* p;
p = new Student;
p -> name = "Wang Fang"//不能用.運算符
p -> num = 10123;
p -> sex = 'm';
cout<<p->name<<endl<<p->num<<endl<<p->sex<<endl;
delete p ;
return 0;
}