天天看點

C++充電站(零)——内置函數和函數重載,函數模版,記憶體的動态配置設定和撤銷記憶體空間

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;
}
           

繼續閱讀