天天看点

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

继续阅读