文档章节

【C++注意事项】3 引用

NoMasp
 NoMasp
发布于 2015/09/08 21:45
字数 1165
阅读 4
收藏 0

通俗来讲,引用(reference)就是给对象另外一个名字。

1)引用必须被初始化

int &ref;  // 错误
int val=10;
int &ref2=val;  // ref2指向val(val的另一个名字)

在初始化变量时,初始值会被拷贝到新建的对象中。在定义引用时,程序把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝到引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另一个对象,因此引用必须初始化。

补充:所谓对象,就是一块存储数据并具有某种类型的内存空间。

2)引用即别名。引用并非对象,它只是另外一个已经存在的对象的名字。

3)引用类型的初始值必须是一个对象。

int &ref3=10;  // 错误

4)可以把引用绑定到const对象上,就像绑定到其他对象一样,它被称为对常量的引用(reference to const)。与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象。

const int cVal= 10;
const int &cRef= cVal;  // 正确: 引用及其对应的对象都是常量
cRef=20;  // 错误: cRef是对常量的引用
int &ref2= cVal;  // 错误: 不能让一个非常量引用指向一个常量对象

5)除了下面的两种例外情况外,所有的引用类型都要和与之绑定的对象严格匹配。

double dVal=20.0;
int %ref4 = dVal;  // 错误

第一种例外情况就是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。

【C++注意事项】1 数据类型及类型转换

尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式。

int i=42;
const int &r1=i;  // 允许const int&绑定到一个普通int对象上
const int &r2=42;  // 正确: r2是一个常量引用
const int &r3=r1*2;  // 正确: r3是一个常量引用
int &r4 =r1*2;  // 错误: r4是一个普通的非常量引用

下面通过一个示例来说明当一个常量引用被绑定到另一种类型上时到底发生了什么。

double dval= 3.14;
const int &ri= dval;

此处的ri引用了一个int型的数。对ri的操作应该是整数运算,但dval却是一个双精度浮点数而非整数。因此为了确保让ri绑定一个整数,编译器把上述代码变成了如下形式:

cosnt int temp= dval;
const int *ri= temp;

在这种情况下,ri其实是绑定了一个临时量(temporary)对象。所谓临时量对象就是当编译器需要一个空间来暂存表达式的求值结果时临时创建一个未命名的对象。临时量对象常被简称为临时量。

如果ri不是常量就会允许对ri赋值,这样就会改变ri所引用对象的值。而此时绑定的对象是一个临时量而非dval。既然用ri引用了dval,那么就是想通过ri修改dval的值了,否则干嘛要给ri赋值呢?那么既然不会想着把引用绑定到临时量上,C++语言便将这种行为归为非法。

6)对const的引用可能引用一个并非const的对象。常量引用仅对可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定。因此对象也可能是一个非常量,所以允许通过其他途径改变它的值。

int i= 42;
int &r1= i;  // 引用ri绑定对象i
const int &r2= i;  // r2也绑定对象i,但是不能通过r2修改i的值
r1= 0;  // r1并非常量,i的值修改为0
r2= 0;  // 错误: r2是一个常量引用

r2绑定非常量整数i是合法的,但是不能通过r2修改i的值。但是可以通过直接赋值或者通过非常量引用来修改。



感谢您的访问,希望对您有所帮助。 欢迎大家关注、收藏以及评论。

我的更多博客文章:NoMasp博客导读


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

本文转载自:http://blog.csdn.net/nomasp/article/details/45875833

NoMasp
粉丝 7
博文 334
码字总数 0
作品 0
镇江
程序员
私信 提问
加载中

评论(0)

C++ 智能指针

智能指针(Smart Pointer),是一个来用存储指向动态分配(堆)对象指针的类。简单的说,它本身是一个类,这个类是用来存储对象指针。 一、智能指针的介绍 智能指针,就是具备指针功能同时提...

长平狐
2013/01/06
861
0
C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

C++强制类型转换:staticcast、dynamiccast、constcast、reinterpretcast 1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换...

shzwork
2019/03/12
14
0
5-C++远征之离港篇-学习笔记

C++远征离港篇 离港总动员 C++远征计划的学习者肯定是冲着封装,继承,多态来的。 知识点: 指针 VS 引用 函数默认值 & 函数重载 内存管理(头疼): 堆中的内存管理几乎完全由程序员操心[出来混...

天涯明月笙
2018/07/20
0
0
C++中extern “C”含义深层探索

首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 通常,在模块的头文件中对本模块提供...

Jerikc
2014/04/24
136
1
C++中extern “C”含义深层探索

1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言...

长平狐
2013/01/06
129
0

没有更多内容

加载失败,请刷新页面

加载更多

在RedisTemplate中使用scan代替keys指令

SCAN 简介 SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements): SCAN 命令用于迭代当前数据库中的...

xiaolyuh
15分钟前
30
0
Babel 插件手册   梦寐以求的文档

来源:https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md Babel 的使用就是使用一些预设配置。预设就是一组插件,比如env, stage-3 flow......

noo-noo
18分钟前
37
0
使用chrome 插件 沙拉查词 在英文pdf 中划词翻译

效果 下载crx插件 链接:https://pan.baidu.com/s/1pF72GZ7EMd5DmMdSCHo8IQ 提取码:tckm 官网 https://saladict.crimx.com/ github https://github.com/crimx/ext-saladict/releases 安装 ......

阿豪boy
23分钟前
31
0
Git 小课堂 004

rebase——变基,就是这个可能会把事情搞得一团糟的操作。 对于变基,我只能说,需要一个配合默契的团队,你们心灵想通,互相了解,然后你们会做出非常漂亮的事情。对于使用变基且几乎不会出...

我是任玉琢
31分钟前
28
0
如何修改MySQL列以允许NULL?

MySQL 5.0.45 修改表以允许列为空的语法是什么,或者替换为什么错误: ALTER mytable MODIFY mycolumn varchar(255) null; 我将手册解释为只运行上面的内容,它会重新创建列,这次允许为nul...

javail
31分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部