31.c/c++程序员面试宝典-函数参数的传递

来源:互联网 发布:人工智能龙头企业 港股 编辑:程序博客网 时间:2024/06/05 06:03

31.c/c++程序员面试宝典-函数参数的传递

在c++中每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。


面试题120  引用形参和非引用形参有什么区别***


分析:把引用变量当成形参传递的就是引用形参,由于引用变量指向的是同一个内存地址,引用传递表面上传的是变量,实际上传的是变量的地址。引用形参把对变量的操作,隐式地转成通过变量地址来对变量操作。


不是引用形参的形参就是非引用形参。

一个引用形参使用的示例代码如下:

void swap(int v1,int v2)  //定义形式参数

{

int tmp=v2;

v2=v1;

v1=tmp;

}


如果这个函数希望可以改变实参本身的值。但是由于函数定义,swap无法影响实参本身,执行swap时,只交换了其实参的局部副本,而传递swap的实参并没有修改。为了使swap函数以期望的方式工作,交换实参的值,需要将形参定义为引用类型。代码如下:

void swap(int &v1, int v2)  //形参定义为引用类型

{

int tmp=v2;

v2=v1;

v1=tmp;

}

这样在调用函数时,实参的值会相应的发生变化。


【答案】引用形参是将参数用参数变量的地址来进行传递,可以修改通过函数对形参的调用来操作实参的值。



面试题121  使用引用形参有什么问题***


分析:先来看下面的一段代码:

int incr(int &val)

{

return ++val;

}

void main()

{

short v1=1;

const int v2=10;

int v3=20;

incr(v1);   //错误,v1不是int类型,类型不对

incr(v2);   //错误,v2是const,常量不可修改

incr(v3);   //正确

incr(10);   //错误

}

所以,调用非const类型的引用形参,实参必须不是const类型的,而且实参的类型和形参的类型应当一致。


当调用一个const引用的形参函数时,如果实参不是一个变量或者类型不匹配,函数会创建一个无名的临时变量用来存储实参的值,并把这个形参作为该临时变量的引用。示例代码如下:

#include<iostream>

using namespace std;

double refcube(const double &ra);

void main()

{

double side1=12.0;

int side2=6;

double c5=refcube(side2);  //实参类型与形参类型不匹配,但是可以转换成正确的类型

cout<<c5<<endl;

double c6=refcube(7.0);  //实参类型与形参匹配,但是不是左值

cout<<c6<<endl;

double c7=refcube(side1+10.0);  //实参类型与形参匹配,但是不是左值

cout<<c7<<endl;

double c8=refcube(side2+4);  //实参类型与形参不匹配,但是可以转换成正确的类型,而且不是左值

cout<<c8<<endl;

}

double refcube(const double &ra)

{

return ra*ra*ra;

}


注意:这种生成临时变量必须是要以const引用为前提的,如果函数为double refcube(double &ra)。则该段程序将无法运行的。


【答案】调用非const类型的引用形参,实参必须不是const类型的,而且实参的类型和形参的类型应当一致。调用一个有const引用的形参的函数时,如果实参不是一个变量或者类型不匹配时,函数会创建一个无名的临时变量用来存储实参的值,并把这个形参作为该临时变量的引用。



122   指针形参与引用形参有什么区别***


分析:函数的形参可以是指针,此时将复制实参指针。与其他非引用类型的形参一样,该类形参的任何改变也仅作用域局部副本。如果函数将新指针赋给形参,主调函数使用的实参指针的值没有改变。


被复制的指针只影响对指针的赋值。如果函数形参是非const类型的指针,则函数可以通过指针实现赋值,修改指针所指向对象的值。

void reset(int *ip)

{

*ip=0;   //ip指针修改ip所指向的对象的值,改变实参所指向对象的值

ip=0;   //形参ip变为0,ip实参依然保持原来的值

}

上面代码的函数被调用之后,实参依然保持原来的值,但是它所指向的对象的值变为0,运行下面的一段代码:

#include<iostream>

using namespace std;

void main()

{

int i=42;

int *p=&i;

cout<<"i="<<*p<<'\n';  //打印输出i=42

reset(p);

cout<<"i="<<*p<<endl;  //打印输出i=0

}


【答案】指针形参是指函数的参数是指针,它不会像引用形参那样通过函数调用影响实参的值,但是调用后它会修改实参的对象。程序中建议尽量少使用指针形参,这样会使程序的可读性下降。


0 0