十、函数参数传递与内联函数

一.函数的参数传递
	函数参数有实参和形参两种。实参可以是常量、变量或表达式,它的类型必须和形参相符。函数没有被调用时,形参并不占用内存,只有在调用时才会分配内存空间,然后将实参传进去。函数参数的传递有两种方式,值调用和引用调用。
1.值调用
给形参分配空间,然后将实参拷贝给形参。之后实参和形参脱离了关系,互不影响。如下:
#include <iostream>
using namespace std;
void swap(int a,int b);
int main()
{
         intx,y;
         cin>>x>>y;
         cout<<x<<""<<y<<endl;
         swap(x,y);
         cout<<x<<""<<y<<endl;
         return0;
         //很明显这两次输入x,y值是相同的
}
void swap(int a,int b)
{
         inttmp;
         tmp=a;
         a=b;
         b=tmp;
}
2.引用调用
如果我们想让被调函数中对形参的修改同样对主调函数中实参有效。则用引用调用:
void swap(int& a,int& b); //这样调用之后x,y值就互换了。

需要注意的是:
	引用是一种特殊变量,变量的别名。对引用名和原来的变量名操作的效果一样。
	引用的形式是:类型标识符 &引用名。
	int i;
	int& ri=I;  //建立一个int型引用ri,初如化为i的一个别名
ps:声明一个引用,必须同时对其初始化,让它指向一个已有对象。一旦初始化后就不能再指向其他对象。(引用定义时便指定了所指对象,之后不能再改变 
.带默认形参值的函数
函数声明时可以定义默认形参值。调用时若给出实参则用实参初始化形参,没有给出实参则用默认形参。如:
int add(inta=3,int b=4)   //定义默认参数
{
       return a+b;
}
int main()
{
       add(10,20);    //实参初始化 add(10,20)
       add(10);        //a采用实参,b默认add(10,4)
       add();            //add(3,4)  都为默认
return ;
}
需要注意的是:默认参数值必须按照从右到左的顺序定义。即、在有默认值的形参右边,不能再出现无默认值的形参。也不能有默认值和无默认值穿插。(这主要是因为调用时实参初始化从左到右,如果定义不对会出现错误情况)如下:
int add(inta,int b=1,int c=2)  //正确
int add(inta=1,int b,int c);   //错误
int add(inta=1,int b,int c=2);   //错误
调用出现在函数体实现之前时,默认形参值必须在声明时给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。如下:
调用在实现之前、
int add(inta=5,int b=6);  //声明时给出
int main()
{
       add();
       return 0;
}
int add(inta,int b)  //此时不需要再重复给出
{….}
调用在实现之后、
int add(inta=5,int b=6)  //实现时给出
{….}
int main()
{
       add();
       return 0;
}
.内联函数
内联函数有代码复用,便于维护等优点。函数调用时有需要保存现场和返回地址等开销。对于一些规模小、简单的函数可以定义为内联函数,内联函数调用时不需要那些转移带来的开销。
  语法形式如下:
  inline  类型标识符  被调函数名(含类型说明的形参表)
使用内联函数要注意的是:1、内联函数体内不能用循环和switch语句;2、内联函数的定义必须出现在内联函数第一次使用之前; 3、内联函数不能进行异常接口说明,即不能声明可能抛出的异常。
此外,内联函数是为提高效率也来,不应该是复杂函数,如果那样会造成代码膨胀,反而增大开销,当然在此情况下编译器会将其做普通函数处理。下面的圆面积的计算就是一个能定义为内联函数的好例子。
inline doubleArea(double r)
{returnPI*r*r;}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值