考试首页 | 考试用书 | 培训课程 | 模拟考场 | 考试论坛  
  当前位置:编程开发 > C/C++ > 文章内容
  

老生常谈C++中实参形参的传递问题

 [ 2017年8月9日 ] 【

  函数中参数的传递

  这里说的传递当然是指 实参是如何传递给形参的啦

  还挺复杂的~~~~~~~~⊙﹏⊙b汗,这里讲述了4种参数传递的情况和注意事项:

  1.非引用形参

  这是最普通,也是最简单的形参传递了。

  参数传递,即是使用实参副本(注意啊,是副本,不是实参本身)来初始化形参;

  因此,在函数体内对形参的修改不会影响实参的值。

  如果形参是指针类型的,那么函数体内是否可以修改指针所指向的对象的值呢?

  如果您产生这样的疑问,表示您很有想法~~~

  答案是~~~需要分情况讨论。

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

  所以,如果需要保护指针指向的值,则形参需定义为指向const对象的指针(注意了,这里的指针依然是非const型的,只是其指向的对象是const型的):

 

void use_ptr(const int *p)
  
{
  
     //use_ptr这个函数可以读指针p所指向的对象,但是不可以修改该对象的值
  
}
  7void use_ptr(const int *p)

  {

  //use_ptr这个函数可以读指针p所指向的对象,但是不可以修改该对象的值

  }

  const形参

  如果函数使用的是非引用非const形参,则既可以给该它传递const实参,也可传递非const实参。

  如果函数使用的是非引用const形参,也是既可以给该它传递const实参,也可传递非const实参。那么这两者的差别是什么呢?对于后者,函数连实参的局部副本都不可以改变了。下面是第二种情况的一个例子: void fcn(const int i) {}

  复制实参的局限性:复制实参不是在所有的情况下都适合,不是一复制实参的情况如下:

  1.当需要在函数中修改实参的值时

  2.当需要以大型对象作为实参传递时。对实际的应用而言,复制对象所付出的时间和存储空间代价往往过大

  3.当没有办法实现对象的复制时

  对于上述几种情况,有效的解决办法是将形参定义为引用或指针类型。

  (终于说完这个最简单的传递方式了,╮(╯▽╰)╭)

  2.引用形参

  引用形参的用法:

  1.让函数修改实参的值

  2.向主调函数返回额外的结果(本来return就可以返回一个值给主调函数,而且引用参数可以改变实参的值,所以相当于返回了额外的结果)

  3.利用const引用避免复制(当向函数传递大型对象时,需要使用引用来提高效率,如果使用引用形参的唯一目的是避免复制实参,则应将形参定义为const引用)

  这是一个不适宜复制实参的例子,该函数希望交换两个实参的值

void swap (int v1,int v2)
 
{
 
  int tmp=v1;
 
  v2=v1;
 
  v1=tmp;
 
}

这个例子期望改变实参本身的值,但是swap无法影响实参本身,执行swap时,指示交换了其实参的局部副本,对实参根本没有改变。解决的方法是:将形参定义为引用类型。

1
2
3
4
5
6
7
8
9
10
11
void swap (int &v1,int &v2)
  
{
  
      int tmp=v1;
  
      v2=v1;
  
      v1=tmp;
  
}

 

当调用swap(i,j)时,i和j的值才真正实现了交换。

更灵活的指向const的引用

应该将不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不大灵活。非const引用形参既不能用const对象初始化,也不能用字面值或者产生右值的表达式实参初始化。(如果函数的形参是非const引用形参,表示在函数体内可能会修改该形参值,即会修改实参的值,因此不可以用const对象来做实参传递给这样的函数,所以不灵活。)

传递指向指针的引用

如果想编写一个与前面交换两个整数的swap类似的函数,实现两个指针的交换。已知需用*定义指针,用&定义引用,问题在于,如何将这两个操作符结合起来一获得指向指针的引用。

1
2
3
4
5
6
7
8
9
//交换两个指向整形的指针的值
  
void ptrswap(int *&v1,int *&v2)
  
{
       int=*tmp=v2;
       v2=v1;
       v1=tmp;
 }

形参int *&v1的定义,应该从右至左的理解:v1是一个引用,与指向int型对象的指针相关联。也就是说,v1只是传递ptrswap函数的任意指针的别名。

3.vector和其他容器类型的形参

由于复制vector会使得效率降低,多以如果形参是vector的话,我们常常将该形参声明为引用,避免复制。另一种方法在C++中更为常用,就是通过传递指向容器中需要处理的元素的迭代器来传递容器。

4.数组形参

首页 1 2 尾页
本文纠错】【告诉好友】【打印此文】【返回顶部
将考试网添加到收藏夹 | 每次上网自动访问考试网 | 复制本页地址,传给QQ/MSN上的好友 | 申请链接 | 意见留言 TOP
关于本站  网站声明  广告服务  联系方式  站内导航  考试论坛
Copyright © 2007-2013 中华考试网(Examw.com) All Rights Reserved