C++中类型可以分为三种
一,内置类型
内置类型是最基本的类型,如int,float,double等。
二,复合类型
复合类型是指基于其他类型定义的类型。C++语言有引用,指针,数组等。
引用通俗的将就是为对象起另外一个名字,引用类型引用另外一种类型。
格式例如:int ival=1024;
int &refVal=ival;
那么在这里refVal就是ival变量的引用。引用应注意以下几点:
1 , 程序不会为引用变量另外再分配内存,它只是它的初始值绑在一起,一旦初始化完成,它和它的初始值对象就一直绑在一起,它只是已存在对象的一个别名。
2,对引用变量的操作也是对其被引用对象的操作,因为它们都指向同一块内存。
3,引用本身不是一个对象,所以不能定义引用的引用。
4,除了以下两种例外情况外,其他所有引用的类型都要与之绑定的对象严格匹配。且引用只能绑定在对象上,不能与字面值和表达式的结果绑在一起。
<1>在初始化常量引用(对“const的引用”简称为“常量引用”)时允许用任意表达式本身的结果能转化为引用类型的表达式作为初始值,尤其允许一个常量表达式引用绑定非常量的对象,字面值和表达式。如 const int &b1=88; const int &b2=b1*2; 。
<2>存在继承关系的类可以将基类的指针或引用绑定到派生类对象上,即当使用基类的引用(或指针)时,实际上我们并不清楚该引用(或指针)所绑定对象的真实类型。 该对象可能是基类的对象,也可能是派生类的对象。
指针是“指向”另外一种类型的复合类型。
与引用相似,指针也实现了对其他对象的间接访问。差异有二:其一,指针本身就是一对象,允许对指针赋值和拷贝,而且在指针的生命周期内,它可以先后指向多个对象;其二,指针不需要在定义时赋初值,若没赋初值,它将和其他内置类型一样拥有一个不确定的值。
指针可以通过取地址符(操作符&)来获取对象的地址;也可用解引用符(操作符*)访问对象。
空指针不指向任何对象,一般声明指针时都将其指向空。其方法有三:
1,在C++ II新标准中新引入一种方法---用字面值nullptr来初始化指针;nullptr是一种特殊类型的字面值,它可以被转成任意其他的指针类型。char *p=nullptr;
2,直接将指针初始化为字面值0。 char *p=0;
3,传统方法是为指针赋值,即用名为NULL的预处理变量。char *p=NULL;
三,类类型
就是类,如string以及自己定义的类。
const限定符
类型符号可以分为类型说明符,类型修饰符,类型限定符三种。
1,类型说明符:可以定义变量的基本都是类型说明符;如常见的int,float,char等。
2,类型修饰符:修饰符,顾名思义,就是起修饰作用,用来修饰说明符;如unsigned ,short用于修饰int。
3,类型限定符:同样也可以知道它起限定作用,比如const,volatile,constexpr等都对所修饰类型进行相应的规范和限定。
那么const作为类型限定符,它对类型变量的作用特点就是定义一个变量时,它的值不能改变,典型的例子就是网络编程中当我们在进行文件传输时,用数组存储每次传输一定字节长度时,其中表示其缓冲区大小的变量,我们并不想在传输完毕前它的大小被改变,这时就可以将其用const限定符进行定义;当初始化const限定的变量时,用一个对象去初始化另一个对象时,它们是不是const(常量)类型都无所谓;当用const的引用(也称之为"对常量的引用")时,它不能被用作修改它所绑定的对象,如const int a=1024;const int &b=a;c=2048; int &b=c;此处常量a的引用b试图修改a的值,这是不对的。
指针和const
和引用一样,指向常量的指针不能用于改变其所指对象的值,要想存放常量对象的地址,只能是指向常量的指针;允许指向常量的指针指向一个非常量对象,如const int a=1024;const int *b=&a;int c;b=&c;此处b是被允许指向c的,只是不能通过b改变c的值而已。和常量引用一样,指向常量的指针也没有规定其所指的对象必须是一个常量。对其的要求仅是不能通过它改变对象的值,而没有这个对象的值不能通过其他方式改变。其实const限定的是其本身,而不是它所指向的那个对象。
顶层const
指针本身就是一个对象,它又可以指向另一个对象。因此用顶层const表示指针本身是个常量,用底层const表示指针所指的对象是一个常量。例如:int a=1024;int *const b1=&a;(顶层const) const int *b2=&a;(底层const),const int *const b3=b2。
在拷贝操作时,顶层const限制对此操作无影响,而底层const限制却很严格;例如:int *p=b3;错误;就是因为b3包含底层const。
再如b2=&i ; int &k=b1;此处int*能转换为const int *,而普通的int&不能绑定在int常量上,因为对于底层const的限制而言,执行对象的拷贝操作时,拷入拷出必须具有相同的底层const,或者两个对象的数据类型必须能够转换,一般非常量可以转化为常量,反之则不可。
constexpr和常量表达式
常量表达式是指值不会改变且编译过程中能够得到结果的表达式。const int a=1024;
C++II新标准规定:允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。
字面值类型:算数类型,引用和指针都属于字面值类型,凡是字面值类型都可以被定义为constexpr类型。
对于指针,如果constexpr声明了一个指针,限定符constexpr仅对指针有效,对指针所指的对象无关。如:const int *a=nullptr;constexpr int *b=nullptr;指针a表示指向整型常量的指针,而指针b表示指向整数的常量指针。