C++中,什么是复合类型?
刚开始,还以为自定义的类是复合类型。查了C++ primer才知道复合类型不是类。
在C++中类型大致可以分为三种
一、内置类型
如int, char, float, unsigned等。内置类型是最基本的类型。
二、复合类型
复合类型:基于其他类型定义的类型,使用其它类型定义的类型。有三种复合类型:引用,指针,数组。
三、类类型
就是类。比如string以及自己定义的类。
(一)复合类型---引用
引用就是为对象起了个名字
引用使用注意事项:
1.一个变量可取多个别名
2. 引用必须初始化
3. 引用只能在初始化的时候引用一次,不能改变为再引其他的变量。
一般初始化变量时,初始值会被拷贝到新建的对象中,但是在定义引用的时候,是通过把引用和它的初始值绑定到一起,一旦初始化完成,引用和它的初始值一直绑定在一起,因为无法令引用绑定到其他对象上,因此引用必须从一而终。
(二)复合类型---指针
指针是指向另外一种类型的复合类型,与引用类似,指针也实现了对其他对象的访问,然而指针与引用又有很多不同点,比如:
1. 引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终),指针变量
的值可变。
2. 引用必须指向有效的变量(引用必须初始化),指针可以为空。
3. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的,
sizeof指针是对象地址的。
4. 指针和引用增(++)减(--)意义不一样。
5. 相对指针,引用更安全。
获取对象的地址
指针获取某个对象的地址,想要获取该地址,需要使用取地址运算符
int ival=42;
int *p=&ival;//p存放ival的地址,或者说是指向ival的指针
因为引用不是对象,没有实际地址,所以不能定义指向引用的指针
建议初始化所有指针
访问未经初始化的指针会造成程序奔溃哦,而且一旦奔溃,想要定位到出错位置就会变得特别棘手
大多数编译器下,如果使用未经初始化的指针,则该指针所占内存空间的当前内容被看做是一个地址值,访问该指针相当于访问一个在本不存在的位置上的本不存在对象。
所以呢。。。。。。想要作为一个合格的程序猿,我们应该初始化所有指针,并且在可能的情况下,等到定义了对象之后再定义指向它的指针,如果实在不清楚该指针应该指向何处,就索性将它置空。
(三)const限定符
有时候我们定义一个变量,它的值不能被改变。例如用一个变量表示缓冲区的大小,使用变量的好处是如果我们觉得缓冲区大小不在合适时可以对其进行调整,另一方面又害怕程序一不小心改变这个值,因此将它用const关键字修饰加以限定
默认状态下,const对象仅在文件内有效
当编译时初始化的方式定义一个变量
const int i=2;
编译器在编译过程中把用到i的地方都替换成相应的值,为了执行上述替换,编译器必须知道变量的初始值,如果程序包含多个文件,则每个const对象的文件都必须得能访问到它的初始值才行,要做到这一点就必须在每一个用到变量的文件中对它定义,,为了支持这个用法,同时避免同一变量被重复定义,默认情况下const对象设定为在本文件中有效,当多个文件出现了同名的const对象时,等同于他们在不同文件中为不同的变量,即使名字相同。
const引用
允许将非常量类型的引用转化为常量类型的引用,指针也一样
int i=10;
const int&j=i;
顶层const
指针是对象而引用不是
允许把指针本身定义成常量,常量指针必须初始化,而初始化一旦完成,则它的值(存放在指针中的那个地址)就不能再改变了,顶层const表示指针本身就是一个常量,底层const表示指针所指向对象是一个常量。
顶层const表示任意的对象是常量,这一点对任何数据类型都适用(算数类型,类,指针等),底层const则与指针和引用等符合类型有关
int i=0;
int*const p1=&i;//不能改变p1的值,这是一个顶层const
const int q=342;//不能改变q的值,这是一个顶层const
const int* p2=&ci;//允许改变p2的值,这是一个底层const