函数参数问题

10 篇文章 0 订阅

    引用是一个变量的别名,除用&取代*外,定义引用的方法与定义指针类似。例如:
   double num1 = 3.14;
   double &num2 = num1; // num是num2的引用
   定义num2为num1的引用,它并没有复制num1,而只是num1的别名。也就是说,它们是相同的变量。例如,如果执行下面的语句:
   num1 = 0.16;
   则num1和num2 的值均为0.16。
   不同于变量的定义:可以先定义,后初始化。正如上面看到的:引用必须在定义时初始化。例如,下面的定义是错误的:
   double &num3; // 非法:引用没有初始化
   num3 = num1;
   引用可用常量来初始化,此时,常量会被复制,引用与其复制值保持一致:
   int &n = 1; // n 取1的复制值
   为什么用常量初始化引用时要被复制,我们看下面的例子:
   int &x = 1;
   ++x;
   int y = x + 1;
   第一行的1和第三行的1可能占用相同的存储单元(大多数编译器将两个1分配在内存中相同的地方),虽然我们期望y的值为3,但它的结果可能是4,这是由于第二行的++x运算后,常量1的值变成了2。如果我们使x取1的复制值,可保证x的改变不会影响到常量的值。
   其实,引用作为另一个变量的别名用处不是很大,除非变量名很长。引用最重要的用处是作函数的参数。我们知道,函数参数传递有值传递和引用传递两种方式。用引用作为函数,是引用传递方式。为了比较值传递和引用传递的区别,我们仍然以交换两个变量值的函数作为例子:
引用作为函数参数 - col1 - 求大offer 例5-14
1 void Swap1 (int x, int y) //值传递
{
  int temp = x;
  x = y;
  y = temp;
}
2 void Swap2 (int *x, int *y) //引用传递(指针)
{
  int temp = *x; *x = *y;
  *y = temp;
}
3 void Swap3 (int &x, int &y) //引用传递
{
  int temp = x;
  x = y;
  y = temp;
}
  在上面的三个函数中,虽然Swap1交换了x和y,但并不影响传入该函数的实参,因为实参传给形参时被复制,实参和形参分别占用不同的存储单元。
   Swap2使用指针作为参数克服了Swap1的问题,当实参传给形参时,指针本身被复制,而函数中交换的是指针指向的内容。当Swap2返回后,两个实参可以达到交换的目的。
  Swap3通过使用引用参数克服了Swap1的问题,形参是对应实参的别名,当形参交换以后,实参也就交换了。
下面的main函数说明调用三个函数时的区别:
引用作为函数参数 - col1 - 求大offer 例5-15
void main (void)
{
  int i = 10, j = 20;
  Swap1(i, j);
  cout << i << ", " << j << '\n';
  Swap2(&i, &j);
  cout << i << ", " << j << '\n';
  Swap3(i, j);
  cout << i << ", " << j << '\n';
}
   main函数运行结果如下:
   10, 20
   20, 10
   10, 20
   我们看到函数Swap3与Swap2的效果一样,都达到了交换的目的,但Swap3更直观,调用它的方法与调用Swap1的方法是一样的。但是,引用作为函数参数,调用时可能会出现歧义,例如:
   void fn(int s)
   {
    …
   }
   void fn(int& t)
   {
    …
   }
   void main()
   {
    int a=5;
    fn(a); //匹配哪一个函数?
   }
   当以引用方式传递函数参数时,我们常使用const关键字。例如:
   void f1(const int i) {
    i++; // 非法,编译错误
   }
   这可以避免在函数中修改了不该修改的参数,有助于提高程序的可靠性
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值