引用形参

转载 2013年12月04日 17:01:45

引用形参

*是去引用运算符,或称之为间接引用运算符

首先看一下 普通形参

复制代码
int add1(int a)
{
    return a+1;
}

void main()
{
    int num = 10;
    int num2;
    num2 = add1(num);
}
复制代码

 

在这种情况下,num的值不会因为调用了add1而改变,即实参的值不变。

 

再来看一下 指针参数

复制代码
void add2(int *p)      
{
*p +=1;
}       

void main()
{
 int num1;
 add2(&num1);
} 
复制代码

 

使用指针做为函数的形参,指针的值(即&num1)不会因为*p+=1而受到影响,但是&num1这个地址里存放的值(num)增加了1。所以要想修改实参的值,可以使用指针形参的方法

 

但是还有一种更安全更自然的方法-引用形参

 

引用形参的格式如下面函数所示:

void swap(int &a,int &b) 
{           
  int temp=a;          
  a=b;           
  b=temp;        
}    

 

  

如果在主函数中调用swap()函数:

void main()
{
 int x = 10, y = 20;
 swap(x,y);
} 

 

 

那么实参x和y的值会被调换过来,也就是说如上所写的引用形参会修改实参的值。

 

如果不想修改实参的值,应该加上const,如下面例子所示。 

void swap(const int &a,const int &b) 

引用形参直接关联到其所绑定的对象,而非这些对象的副本。 所以这种方法可以修改实参的值,而且更加直观。

 

 

注:以下内容转自http://www.cppblog.com/liujiajia/archive/2008/07/14/56131.html

使用引用形参的优点:

      在向函数传递大对象时,需要使用引用形参。虽然赋值实参对于内置数据类型的对象或者规模较小的类型来说没有什么问题,但是对于大部分的类型或者大型数组,它的效率就比较低了。另外,某些类型是无法复制的。使用引用形参,函数可以直接访问实参对象,而无须复制它。

示例:
      bool isShorter(const string &str1,const string &str2)//const
      {
             return str1.size()<str2.size();
      }
      由于string对象可能非常的长,我们希望避免复制操作。
      如果使用引用形参的唯一目的是避免复制形参,则应将形参定义为const引用。

使用引用形参应该注意的:

      int incr(int &val)
      {
          return ++val;
      }
      void main(void)
      {
             short v1=1;
             const int v2=10;
             int v3=20;

             incr(v1);      //错误,v1不是int
             incr(v2);      //错误,v2是const
             incr(v3);      //正确
             incr(10);      //错误      
      }

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

 

一个引用形参被翻译成一个指针变量,相应的实参被翻译成这个实参的地址。当在函数中被使用时,指针形参被自动的去引用,从而产生对应实参的别名。(from数据结构与算法分析)

 

在以上例子中,引用形参 val被翻译成一个指针变量,调用incr(v3)时,v3这个实参被翻译成v3的地址。

循环队列(引用作形参)

  • 2012年09月19日 21:26
  • 28KB
  • 下载

c++中的引用和形参

  • 2012年06月07日 11:09
  • 17KB
  • 下载

不要怀疑,结构体作为形参可以按引用传递!

写了个程序,出了问题,还以为结构体不能按引用传递。事实证明,我错了,我错误的原因也找到了,跟结构体的引用没有任何关系。罗嗦一点,把二叉树的非递归后序遍历代码和自己写的链栈GetTop函数贴在下面: ...

關於JAVA中String类以形参传递到函数里面,修改后外面引用不能获取到更改后的值

一、 最开始的示例 写代码最重要的就是实践,不经过反复试验而得出的说辞只能说是凭空遐想罢了。所以,在本文中首先以一个简单示例来抛出核心话题:public class StringAsParamOfM...
  • JQ_AK47
  • JQ_AK47
  • 2016年10月03日 15:27
  • 5474

什么拷贝构造函数的形参必须是引用类型?

复制构造函数只有一个参数,由于在创建时传入的是同种类型的对象,所以一个很自然的想法是将该类型的对象作为参数,像这样:      Sample (Sample a);      不幸的是,即使是这样...

C++Primer:函数(参数传递:引用形参)

1.问题的引入 考虑下面不适宜复制实参的例子,该函数希望交换两个实参的值: void swap(int v1, int v2) { int temp = v2; v2 = v...

const对象引用做为形参

今天在写代码的时候,发现添加了下面的这个函数(update)之后,怎么都编译通不过。大概的原始代码如下: #include #include using namespace std; class ...
  • shltsh
  • shltsh
  • 2014年01月03日 23:26
  • 1274

c++左值引用作为函数形参时的注意要点

#include using namespace std; void f(int i) {     i += 5; } void ref_f(int &i) {     i +...

第十七周 【项目2-引用作形参】

问题及代码:/* *Copyright (c) 2014,烟台大学计算机学院 *ALL right reserved *文件名:引用作形参 *作者;童宇 *完成日期:2014年12月17日 *版本号v...

第十七周项目二——引用作形参

/* Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2014年 12...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:引用形参
举报原因:
原因补充:

(最多只允许输入30个字)