您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记——函数

2015-07-14 14:59 344 查看

1.内联(内置)函数

C++提供一种提高效率的方法,即在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为内置函数(inline
function),又称内嵌函数。在有些书中把它译成内联函数。

#include <iostream>
using namespace std;
inline int max(int, int,  int); //声明函数, 注意左端有inline
int main( )
{
int i=10, j=20, k=30, m;
m=max(i, j, k);
cout<<"max="<<m<<endl;
return 0;
}

inline int max(int a, int b, int c) //定义max为内置函数
{
if(b>a) a=b;//求a, b, c中的最大者
if(c>a)
a=c;
return a;
}

注意:可以在声明函数和定义函数时同时写inline,也可以只在其中一处声明inline,效果相同,都能按内置函数处理。
归纳起来,只有那些规模较小而又被频繁调用的简单函数,才适合于声明为inline函数。

2.重载(overring)

1)C++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同。这就是函数的重载(function
overloading)。即对一个函数名重新赋予它新的含义,使一个函数名可以多用。

2)其实重载函数并不要求函数体相同;除了允许参数类型不同以外,还允许参数的个数不同。
3)参数的个数和类型可以都不同。但不能只有函数的类型不同而参数的个数和类型相同。 

3.函数模板

所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。

定义函数模板的一般形式为:
    template < typename T>
    通用函数定义  通用函数定义

    template <class T>
    通用函数定义  通用函数定义

#include <iostream>
using namespace std;
template<typename T>  //模板声明,其中T为类型参数
T max(T a,T b,T c) //定义一个通用函数,用T作虚拟的类型名
{
if(b>a) a=b;
if(c>a) a=c;
return a;
}

int main( )
{
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); //调用模板函数,此时T被int取代
d=max(d1,d2,d3); //调用模板函数,此时T被double取代
g=max(g1,g2,g3); //调用模板函数,此时T被long取代
cout<<"i_max="<<i<<endl;
cout<<"f_max="<<f<<endl;
cout<<"g_max="<<g<<endl;
return 0;
}

类型参数可以不只一个,可以根据需要确定个数。如:
    template <class T1, typename T2>
可以看到,用函数模板比函数重载更方便,程序更简洁。但应注意它只适用于函数的参数个数相同而类型不同,且函数体相同的情况,如果参数的个数不同,则不能用函数模板。

4.函数的默认参数

1)一般情况下,在函数调用时形参从实参那里取得值,因此实参的个数应与形参相同。有时多次调用同一函数时用同样的实参,C++提供简单的处理办法,给形参一个默认值,这样形参就不必一定要从实参取值了。如有一函数声明:
    float area(float r=6.5);

指定r的默认值为6.5,如果在调用此函数时,确认r的值为6.5,则可以不必给出实参的值,如:
    area( ); //相当于area(6.5);

2)如果有多个形参,可以使每个形参有一个默认值,也可以只对一部分形参指定默认值,另一部分形参不指定默认值。

3)实参与形参的结合是从左至右顺序进行的。因此指定默认值的参数必须放在形参表列中的最右端,否则出错。
4)在使用带有默认参数的函数时有两点要注意:
如果函数的定义在函数调用之前,则应在函数定义中给出默认值。如果函数的定义在函数调用之后,则在函数调用之前需要有函数声明,此时必须在函数声明中给出默认值,在函数定义时可以不给出默认值(如例4.8)。
一个函数不能既作为重载函数,又作为有默认参数的函数。因为当调用函数时如果少写一个参数,系统无法判定是利用重载函数还是利用默认参数的函数,出现二义性,系统无法执行。
如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static。函数首部的一般格式为:
    static 类型标识符 函数名(形参表);

    static int fun(int a, int b);

5.内部函数、外部函数

1)如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static。函数首部的一般格式为:
    stati
a92b
c 类型标识符 函数名(形参表);

    static int fun(int a, int b);
内部函数又称静态(static)函数。使用内部函数,可以使函数只局限于所在文件。

2)在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。如函数首部可以写为:
    extern int fun (int a, int b);
这样,函数fun就可以为其他文件调用。如果在定义函数时省略extern,则默认为外部函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 函数