概述
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
}
【答案】指针形参是指函数的参数是指针,它不会像引用形参那样通过函数调用影响实参的值,但是调用后它会修改实参的对象。程序中建议尽量少使用指针形参,这样会使程序的可读性下降。
最后
以上就是迷人柜子为你收集整理的31.c/c++程序员面试宝典-函数参数的传递的全部内容,希望文章能够帮你解决31.c/c++程序员面试宝典-函数参数的传递所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复