代码改变世界

白话C++系列(2)-- 引用类型

2016-04-08 22:03  Keiven_LY  阅读(1619)  评论(0编辑  收藏  举报

C++远征之离港篇

C++引用类型

引例

小时候,院子里有一个小孩,名叫罗某某,外形上来看,头大身子小,所以院子里的其他小朋友就给罗某某起了个外号(别名)叫萝卜头。这样,生活中,罗某某就是这个小朋友的真实姓名,萝卜头就是这个小朋友的别名。

那么,什么叫引用呢????引用就是别名。

计算机中,引用就是某个变量的别名。

思考:能不能只有别名,而没有真实姓名呢?

生活中,如果某个人只有别名的话,是不是就变成了他的真实姓名了呢?可见,只有别名,生活中其实也是不可行的,而在计算机中,肯定也一样的道理,也是无法成立的。

基本数据类型的引用

请看下面一段代码:

#include <iostream>
using namespace std;

int main()
{
    int a = 3;
    int&b = a; //引用必须初始化
    
    b = 10;
    cout<< a <<endl;
    return 0;
}

代码解读:

我们定义了一个基本数据类型,即定义了一个整形变量a,给它赋了初值3;接着给变量a起了一个别名b(int&b = a;),这里需要注意,如果只起别名b,后面什么都步跟,在编译时就会报错,所以,在起别名时,一定要指明给哪个变量起的别名,即引用一定要初始化

然后,我们给b赋值10,通过输出的方式来输出变量a的值,我们会看到输出结果是10。从程序运行结果来看,对别名的修改,就是对实际变量的修改。类似于生活中,我们让小萝卜头去干活,实际就是让罗某某去干活是一样的道理。

结构体类型的引用

请看下面一段代码:

#include <iostream>
using namespace std;

typedefstruct
{
    int x;
    int y;
}Coor;

int main()
{
    Coor c1;
    Coor&c = c1; //对c1起了个别名叫c
    c.x = 10;
    c.y = 20;
    cout<< c1.x <<endl;
    cout<< c1.y <<endl;
    return 0;
}

代码解读:

首先,定义一个坐标类型的结构体Coor,里面包含横坐标x和纵坐标y;接着在main函数中定义了一个结构体变量c1,然后对结构体c1起了个别名,叫c;再然后对c中的横坐标x和纵坐标y分别进行了赋值操作,即用别名对相应的数据成员做了操作;最后,通过输出函数,将实体c1的横坐标和纵坐标打印出来。从打印结果来看,实体c1的横坐标为10,纵坐标为20。(因为操作别名与操作实体是没有区别的

指针类型的引用

指针类型的引用的定义方式:类型 *&指针的别名 = 指针

请看下面一段代码:

#include <iostream>
using namespace std;

int main()
{
    int a =10;
    int *p = &a; //定义了一个指针指向整形变量a    
    int *&q = p; //给指针p起了一个别名q
    *q = 20;
    cout<< a <<endl;
    return 0;
}

代码解读:

程序中,首先定义了一个整形变量a,并且对其赋了初值10;然后定义了一个指针变量p,让指针p指向了整形变量a(int *p = &a;);接着,我们给指针p起了一个别名叫q,并对q赋值为20(这里相于给*p复制为20,由于p是指向a的,又相当于给a重新赋值为20);最后输出a。从输出结果看,a的值变为了20。

引用作为函数参数

在没有引用之前,要交换两个数,需要如下操作

#include <iostream>
using namespace std;

void fun( int *a, int *b)
{
    int c=0;
    c = *a;
    *a =*b;
    *b = c;
}

int main()
{
    int x=10, y=20;
    fun(&x, &y);
    cout<< x << ',' << y <<endl;
    return 0;
}

从上面的程序来看,比较繁琐,而且需要一定的理解能力。

当我们有了引用之后,程序可以这样来写:

#include <iostream>
using namespace std;

void fun( int&a, int&b)
{
    int c=0;
    c = a;
    a =b;
    b = c;
}

int main()
{
    int x=10, y=20;
    fun(x, y);
    cout<< x << ',' << y <<endl;
    return 0;
}

从上面的程序来看,功能函数就简单多了,传入的两个实参就会分别起别名a和b,对别名进行交换就相当于对实体的实际操作。