C++引用的进一步深入学习
Posted LC编程开发者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++引用的进一步深入学习相关的知识,希望对你有一定的参考价值。
引用的进一步深入学习
有了以上的初步知识后,再对使用引用的一些细节做进一步讨论。
(1) 不能建立 void 类型的引用,如:
void &a = 9; //错误
因为,任何实际存在的变量都是属于“非void”类型的,不存在void类型的变量。所以,就没有void类型变量的引用。void的含义是无类型或空类型。
但是,我们可以定义一个void*类型(void指针类型)的变量,所以,可以建立void*类型变量的引用,例如:
程序运行结果如下:
在上面的例子中,我们定义了一个int类型变量a。并且把变量a的地址赋给void*类型的指针变量pa。
然后,定义void*类型指针变量引用pb,设置pb引用指针变量pa。
所以,最终,指针变量引用pb是指向变量a。那么,我们可以使用cout对象输出指针变量引用pb指向的变量a。根据变量a是int类型。所以,通过指针类型转换,转换为int*类型,然后,再取指针指向的数据值。
通过这个例子,我们可以发现,void类型指针是非常有用的一个数据类型。特别是Linux系统编程中,创建一个线程的时候,给线程函数体传递的参数是用户自己定义的数据,所以,数据类型就是void*类型。然后,在线程函数体中,用户根据自己传递的数据类型,再进行类型转换,还原得到传递过来的正确数据类型。
后面我们在《韦凯峰Linux 系统编程》的课程中,介绍Linux 多线程的开发,会介绍这个知识点,我们就知道void*类型是多么的有用。
(2) 不能建立引用的数组,如:
char c[6] = "hello"; //定义字符数组;
char &rc[6] = c; //错误
希望建立一个包含6个元素的引用的数组,这样是不行的,数组名c只代表数组首元素的地址,本身并不是一个占有存储空间的变量。
(3) 可以将变量的引用的地址赋给一个指针,此时,指针指向的是原来的变量,如:
int a = 3; //定义a 是整型变量
int &b = a; //声明b 是整型变量a的别名,b是变量a的引用;
int *p = &b; //指针变量p 指向变量a 的引用b,相当于指向a,合法
相当于 p 指向变量 a,其作用与下面一行相同,即:
int *p = &a;
如果输出 *p 的值,就是 b 的值,也是 a 的值。但是,不能定义指向引用类型的指针变量,不能写成:
int& *p = &a; //企图定义一个指针*p,它指向整型的引用int&,这是错误的,没有这样的用法
由于引用不是一种独立的数据类型,因此,不能建立指向引用类型的指针变量。
(4) 可以建立指针变量的引用,如:
int i = 5; //定义整型变量i 的值为5
int *p = &i; //定义指针变量p 指向变量i
int* &pt = p; //定义pt 是一个引用,它指向的类型是int*,而且,在定义的时候,给其赋初值p,所以,pt 就是 p 的一个引用。
从定义的形式可以看出,&pt 表示 pt 是一个变量的引用,它代表一个 int* 类型的数据对象(即指针变量),那么,输出 *pt 的值,就是 *p 的值 5。
(5) 可以用const对引用加以限定,不允许修改该变量的值,如:
int i = 5; //定义整型变量i ,初值为5
const int &a = i; //声明常引用,不允许改变a 的值
a = 3; //错误,企图修改引用a 的值
但是,它并不阻止改变引用所代表的变量的值,如:
i = 3; //合法
这一特征在使用引用作为函数形参时是有用的,因为,有时希望保护形参的值不被改变。
(6) 可以用常量或表达式对引用进行初始化,但,此时必须用 const 作声明,如:
int a = 168; //定义int类型变量a;
const &b = a + 1; //合法,定义b引用一个表达式。
此时,编译系统会这样处理的:生成一个临时变量,用来存放该表达式的值,引用是该临时变量的别名。所以,系统将“const &b = a + 1”转换为:
int temp = a + 1; //先将表达式的值存放在一个临时变量temp 中
const int &b = temp; //声明b 是temp 的别名
临时变量是在系统内部实现的,用户不能访问临时变量。程序测试代码如下:
程序运行结果如下:
用这种方法不仅可以用表达式对引用进行初始化,还可以用不同类型的变量对其初始化(要求能赋值兼容的类型)。程序测试例子如下:
程序运行结果如下:
在程序中的代码:
double a = 168.999; //a 是double 类型变量
const int &b = a; //用变量a 初始化引用b;
编译系统将"const int &b = a;"转换为:
int temp = a; //先将double 类型变量a 转换为int 类型,存放在temp 中。此时,temp得到变量a的整数部分。因为,a是double类型,转换成int类型,就是获取整数部分。
const int &b = temp; // temp 和b 同类型,此时 b 是 temp的引用。
所以,输出引用b的值,将是 168 而不是 168.999。
韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip
以上是关于C++引用的进一步深入学习的主要内容,如果未能解决你的问题,请参考以下文章