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