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会绑定一个临时量对象,临时量就是当编译器需要一个空间来暂存表达式的求值结果时临时创建的一个未命名的对象。

指向常量的指针

这种常量指针用来存放常量对象的地址。也可以用来存放普通对象,但是不能通过指针来改值。 指针常量必须初始化。可以改对象的值不能改地址

上一篇:Unity之PlayerPrefs
下一篇:C++Primer(二)

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年03月30日 17时54分19秒