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++引用的进一步深入学习的主要内容,如果未能解决你的问题,请参考以下文章

JAVA8学习——深入浅出方法引用(学习过程)

深入学习C++.2016_3_7

Django进一步深入学习

深入学习Redis:哨兵

C++基础学习笔记深入理解C++函数重载(非常重要!!!)

深入学习c++--左值引用和右值引用