白话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,对别名进行交换就相当于对实体的实际操作。