
C++Primer(二)续
目前我们接触的声明符就是变量名,其实可能存在更复杂的说明符。 复合类型是指基于其他类型定义的类型。本节主要学习两个复合类型,引用和指针。
发布日期:2021-05-08 16:29:36
浏览次数:16
分类:精选文章
本文共 1696 字,大约阅读时间需要 5 分钟。
复合类型
目前我们接触的声明符就是变量名,其实可能存在更复杂的说明符。 复合类型是指基于其他类型定义的类型。本节主要学习两个复合类型,引用和指针。
文章目录
一、引用
初始化变量时,初始值会被拷贝到新建的对象之中去。 定义引用时,程序就把引用和它的初值绑定。 一旦初始化完成,引用就和初始化对象绑定在一起。因为引用无法重新绑定其他对象,因此引用必须初始化。(无法修改的量需要有一个初值)。 引用只是一个存在的对象的别名,不是对象,因此不能够定义引用的引用二、指针
指针本身时一个对象,无需在定义时赋值。 指针值(即地址)应处于下列4种状态之一: 1.指向一个对象。 2.指向紧邻对象所占空间的下一个位置 3.空指针,意味指针没有指向任何一个对象。 无效指针,上述之外的情况。比如直接让指针指向一块特定的地址(野指针)。试图拷贝和访问无效指针并不被编译器检查。因此我们编程时应注意指针是否有效。2、3种状态使用仍然没有指向具体的对象,因此访问这类指针也是不被允许的。 解引用操作就仅使用于指向了某个对象的有效指针。 在对指针进行如判断==、!=等操作的时候指针必须合法的指针。如果两个指针存放的地址相同,他们可能都为空,都指向同一个对象或者都指向同一个对象的下一个地址。空指针
代码如下:
int *p1 = nullptr; //等价于int *p1 = 0;int *p2 = 0; //直接初始化p2为字面量0;int *p3 = NULL //预处理变量 #define NULL 0;//在新标准下使用nullptr另外int变量不能直接赋值给int指针。我们建议初始化所有的指针
void*指针
void*指针可以放任意对象的地址。 执行的操作有限:进行指针的比较 作为函数的输入或者输出,或者赋值给另一个void*指针。但是不能直接操作void*指针指向的对象。 ### 指向指针的引用 引用本身不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用。int i = 42;int *p;int *&r = p;//定义了一个指向指针的引用,*说明r引用的是一个指针r = &i;*r = 0;
3.const限定符
用关键字const修饰一个变量,就把其定义为了一个常量,任何试图为其赋值的操作都会报错。同理,因为const对象创建后就不能修改,所以必须初始化。const int i = get_size();//运行时初始化const int j = 42; //编译时初始化const对象能完成执行不改变其内容的操作,还有一种初始化是用一个对象初始化另一个对象。这种拷贝方式使新对象与原对象没有什么关系了。 默认状态下const对象仅在文件内有效,但有时const对象的初始值不是常量表达式,但又需要共享,解决方法就是对const变量不管是声明还是定义都添加extern关键字,这样只需定义一次就行了
//file_1.cc定义并初始化了一个常量,//该常量能被其他文件访问extern const int bufSize = fcn();//fule_1.h头文件extern const int bufSize;//与定义file1_1.cc的bufSize是同一个
常量引用
常量引用是一个简称,因为引用并不是一个对象,所以原词组是“对const的引用”。常量引用的初始化允许使用任意表达式作为初始值,只要该表达式能转化为引用的类型即可。double dval = 3.14;const int &ri = dval;//这时为了确保让ri绑定一个整数,编译器内部会//将代码变为const int temp = dval;//const int& ri = temp这时ri会绑定一个临时量对象,临时量就是当编译器需要一个空间来暂存表达式的求值结果时临时创建的一个未命名的对象。
指向常量的指针
这种常量指针用来存放常量对象的地址。也可以用来存放普通对象,但是不能通过指针来改值。 指针常量必须初始化。可以改对象的值不能改地址发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年03月30日 17时54分19秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
使用js打印时去除页眉页脚
2021-05-09
Spring security OAuth2.0认证授权学习第二天(基础概念-RBAC)
2021-05-09
ORA-00904: "FILED_TYPE": 标识符无效
2021-05-09
数据仓库系列之维度建模
2021-05-09
Scala教程之:函数式的Scala
2021-05-09
java中DelayQueue的使用
2021-05-09
线程stop和Interrupt
2021-05-09
Android中定时执行任务的3种实现方法
2021-05-09
nodejs中npm常用命令
2021-05-09
基于Vue2.0+Vue-router构建一个简单的单页应用
2021-05-09
基于vue2.0实现仿百度前端分页效果(二)
2021-05-09
JS魔法堂:函数重载 之 获取变量的数据类型
2021-05-09
时间序列神器之争:Prophet VS LSTM
2021-05-09
SpringBoot中关于Mybatis使用的三个问题
2021-05-09
MapReduce实验
2021-05-09
Leaflet 带箭头轨迹以及沿轨迹带方向的动态marker
2021-05-09
java大数据最全课程学习笔记(1)--Hadoop简介和安装及伪分布式
2021-05-09
java大数据最全课程学习笔记(2)--Hadoop完全分布式运行模式
2021-05-09
大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?
2021-05-09