复合类型
- 引用reference
格式:基本数据类型+声明符(&d)= 对象;其中d是声明的变量名;
eg. int ival = 1024;
int &refVal = ival;
- 引用即是一个存在的对象/变量的另外的一个名字;
- 引用不是一个对象,对引用的操作即是对其绑定对象的操作;
- 引用必须与初始值bind在一起,并且无法重新bind到另外一个对象;
- 指针pointer
与引用的不同之处:
- 指针本身是一个对象,允许对指针复制和拷贝,可以先后指向不同的对象;
- 指针无须在定义时赋初值。
- 格式:声明符*d,其中d是声明的变量名
- 空指针:nullptr/0/NULL
- Void*指针:
不能直接操作void*指针所指的对象;
作用:与别的指针比较、作为函数的输出或输入?
- 指向指针的引用:
eg. int *&r = p; //从右向左读r的定义,离变量名最近的符号为&,所以r为引用
// 符号*说明r引用的是一个指针
- Const 限定符
- Const解释:
- const修饰的对象不能改变其值,且必须初始化;
- 默认状态下,const对象仅在文件内有效;共享则加extern修饰符
- const int bufSize = 512; 编译器将bufSize用512替换;
- 对const的引用/常量引用
- 引用——通过引用的操作间接对绑定对象的操作,即是对象的别名
- const修饰符——不能改变被修饰引用的值;
- Const解释:
两者共同作用:不能改变被绑定对象的值;
一般的用例:const int ci = 1024; const int &r1 = ci;//普通的用法
特殊的用例:const int &ri = (非常量的对象、字面值、表达式);
//此时,ri 绑定了一个临时量对象
编译器将其等价于
????????????????Const int temp = (非常量的对象、字面值、表达式);
????????????????Const &ri = temp;
- 常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定。
- 指针与const
- const 的位置很重要!!!!
- Const的位置决定—— 常量指针,指向常量的指针;指向常量的常量指针;
- 常量指针: double pi = 3.14159;
double *const ptr = π//ptr是一个常量指针
ptr = &pi1; //错误,const限制了指针的指向操作;
*ptr = 3.1;????????//正确,ptr指向对象的操作正常
?
- 指向常量的指针:const double *ptr = π //ptr是一个指向常量的指针
*ptr = 3.1; //错误,const限制了指针指向对象的操作
Ptr = &pi1; //正确,ptr可以指向其他对象
- 指向向量的常量指针: const double *const ptr = π
*ptr = 3.1; //错误
Ptr = &pi1; //错误
?
- 顶层const与底层const
- 一个const是底层还是顶层?
//low-level and top level
????int i = 0;
????int *const p1 = &i; //顶层const
????const
int ci = 42;???????? //顶层const
????const
int *p2 = &ci;???? //底层const
????const
int *const p3 = p2; //左边一个const为顶层const,右边一个为底层cosnt
???? const
int &r = ci;???????? //凡是用于声明引用的const都是底层const
- 总结:
- const修饰的是基本类型时,此时const的是顶层的;
- const修饰的是类似于指针的符合类型时,此时判断const顶层或底层取决于const 的位置;
- 引用(&),是底层const的;
?
- 当Constexpr 和常量表达式
- 什么是常量表达式?
- 值不会改变
- 在编译过程就能够得到计算结果的表达式;
- 取决于数据类型(有无const限制)与初始值(是个常量);
- 引入constexpr变量
判断初始值是不是常量表达式很麻烦,,所以引入constexpr 类型,让编译器来验证变量值石头是一个常量表达式。
- 字面值类型
什么的类型能可以被定义为constexpr?——字面值类型(指针、引用、算术类型)
定义后的constexpr初始值
- 指针和constexpr
- 定义constexpr成的指针初值只能是:nullpt、0、存储在某个固定地址中的对象。函数体内定义的变量一般来都并非存放在固定地址。
- constexpr 将指针置为顶层的const;即一个常量指针;
- 指针和constexpr
Ch2_2&3复合类型