zoukankan      html  css  js  c++  java
  • C++中函数变量的引用 &

    给别人起绰号是件不好的事情,但是在程序设计中,给变量或参数起个绰号却会给我们带来一些方便。绰号,就是另一种称呼。绰号和本名都是指同一样东西,绰号也是个名称,所以它的命名规则其他的命名规则一样,详情可参见3.1。另外,“绰号”显然也不能和“本名”相同。

    这种给变量起“绰号”的操作称为引用(Reference),“绰号”称为引用名。声明引用的语法格式为:
        变量数据类型 &引用名=已声明的变量名;

    我们对变量使用了引用以后,对引用的操作就如同对被引用变量的操作。这就好像叫一个人的绰号和叫一个人的本名有着同样的效果。在声明一个引用时,必须告知电脑到底是哪个变量被引用,否则这个“绰号”就显得有些莫名其妙了。

    下面我们来看一段简单的程序:(程序6.5.1)
    #include "iostream.h"
    int main()
    {
       int a=2;
       int &b=a;//给变量a起了个绰号叫b
       cout <<"a=" <<a <<endl;
       cout <<"b=" <<b <<endl;
       a++;
       cout <<"a=" <<a <<endl;
       cout <<"b=" <<b <<endl;
       b++;//对b的操作也就是对a的操作,所以b++就相当于a++
       cout <<"a=" <<a <<endl;
       cout <<"b=" <<b <<endl;
       return 0;
    }

    运行结果:
    a=2
    b=2
    a=3
    b=3
    a=4
    b=4

    我们在这个程序中,能够验证对引用的操作相当于对被引用变量的操作。或许你还没看出引用到底派了什么大用处,不过马上你就会恍然大悟了。

    用引用传递参数

    其实引用最有用的地方还是在函数当中,下面我们先来看一个简单的例子:
    #include "iostream.h"
    void swap(int x,int y);
    int main()
    {
       int a=2,b=3;
       swap(a,b);
       cout <<"a=" <<a <<endl;
       cout <<"b=" <<b <<endl;
       return 0;
    }
    void swap(int x,int y)
    {
       int temp;
       temp=x;
       x=y;
       y=temp;
    }

    运行结果:
    a=2
    b=3

    在以上这段程序中,swap函数的语句是我们熟悉的交换语句,可是为什么执行了这个swap函数以后,a和b的值并没有交换呢?

    在6.2中,我们介绍过,函数是将实参的值赋给了形参。这就像本来我们想交换a碗和b碗里的水,调用了swap函数则是拿来了x碗和y碗,然后把a碗里的水分一点到x碗里,b碗里的水分一点到y碗里,再把x碗和y碗里的水交换。可是,这样的操作有没有将a碗里的水和b碗里的水交换呢?没有。而且,我们还知道,一旦函数运行结束,函数中定义的参数和变量就都会消失,所以就连x碗和y碗也都没有了。

    问题到底在于哪里呢?在于我们传给函数的是“水”,而不是“碗”。如果我们直接把a碗和b碗交给函数,那么这个任务就能够完成了。下面我们就来看看如何把“碗”来传递给函数:(程序6.5.2)
    #include "iostream.h" 
    void swap(int &x,int &y);//用引用传递参数
    int main()
    {
       int a=2,b=3;
       swap(a,b);
       cout <<"a=" <<a <<endl;
       cout <<"b=" <<b <<endl;
       return 0;
    }
    void swap(int &x,int &y)//函数定义要和函数原型一致
    {
       int temp;
       temp=x;
       x=y;
       y=temp;
    }

    运行结果:
    a=3
    b=2

    如果我们把没有使用引用的参数认为是int x=a和int y=b(把变量a和变量b的值分别传给参数x和参数y),那么使用了引用的参数就是int &x=a和int &y=b了。也就是说x和y成为了变量a和变量b的“绰号”,对参数x和y的操作就如同对变量a和b的操作了
    声明引用的语法格式为:
        变量数据类型 &引用名=已声明的变量名;

    这个和C#的ref与OUT其中有什么奥秘? 

  • 相关阅读:
    LeetCode Flatten Binary Tree to Linked List
    LeetCode Longest Common Prefix
    LeetCode Trapping Rain Water
    LeetCode Add Binary
    LeetCode Subsets
    LeetCode Palindrome Number
    LeetCode Count and Say
    LeetCode Valid Parentheses
    LeetCode Length of Last Word
    LeetCode Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/Luouy/p/2630454.html
Copyright © 2011-2022 走看看