一.参数传递机制
函数被调用时才分配形参的存储单元。
实参可以是常量、变量或表达式。
实参必须与形参相符(对应实参与形参的值相同)。
传递是传递参数值,即单向传递。
二.内联函数
声明时使用关键字 inline
例如 inline int add(int a,int b)
目的:编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。
注意:(1)内联函数体内要简单,不能有循环语句和switch语句。
(2)内联函数的声明必须出现在内联函数第一次被调用之前。
三.带默认形参值的函数
函数在声明时可以预先给出默认的形参值,调用时如果给出实参,则采用实参值,否则采用预先给出的默认形参值。
缺省形参值必须从右向左顺序声明,并且在缺省形参值的后面不能有非缺省形参值的参数。因为调用时实参代替形参是从左到右的顺序。
int add(int x,int y=5,int z=6); //正确。
int add(int x=1;int y=9;int z); //错误。
#include<iostream>
using namespace std;
void add(int a=1,int b=2)
{
int z;
z=a+b;
cout<<z<<endl;
}
void main()
{
add();
add(2);
add(2,3);
}
三次调用函数依次输出的值为3,4,5
四.重载函数
c++允许功能相近的函数在相同的作用域内以形同函数名声明,从而形成重载函数。
重载函数的形参必须不同:个数不同或类型不同。
编译器不以形参名来区分,
int add(int x,int y)
int add(int a,int b)
编译器不以返回值来区分。
int add(int a,int b)
void add(int a,int b)
#include<iostream>
using namespace std;
void add(int a,int b)
{
int z;
z=a+b;
cout<<"z="<<z<<endl;
}
void add(double a,double b)
{
double z;
z=a+b;
cout<<z<<endl;
}
void main()
{
add(4.4,5.5); //z=9.9
add(2,3); //z=5
}
在主函数中调用两次add函数,第一次调用void add(double a,double b),第二次调用void add(nt a,int b)
五.函数模板
函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数体设计。
声明方法:
template<typename 标示符>
例 .求绝对值函数的模板。
#include<iostream>
using namespace std;
template<typename T>
T abs(T x)
{
return x<0?-x:x;
}
void main()
{
int n=-5;
double d=-5.5;
cout<<abs(n)<<endl; //5
cout<<abs(d)<<enfl; //5.5
}
分析:编译器从调用abs( )时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为 int型,所以推导出模板中类型参数T为int。 当类型参数含义确定后,编译器将以函数模板为样板,生成一个函数:
int abs(int x)
{ return x<0?-x:x;}