一.函数的参数传递函数参数有实参和形参两种。实参可以是常量、变量或表达式,它的类型必须和形参相符。函数没有被调用时,形参并不占用内存,只有在调用时才会分配内存空间,然后将实参传进去。函数参数的传递有两种方式,值调用和引用调用。 1.值调用 给形参分配空间,然后将实参拷贝给形参。之后实参和形参脱离了关系,互不影响。如下:2.引用调用#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; }
如果我们想让被调函数中对形参的修改同样对主调函数中实参有效。则用引用调用:
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;}
十、函数参数传递与内联函数
最新推荐文章于 2024-06-14 16:58:28 发布