const, 指针,引用

简介

const 类型的值不可改变,可以同时只用一个const定义多个值: const int a, b, c 和指针引用不一样。
引用需要初始用&赋值, 初始化多个变量的时候,每个变量前面都应该有&, 和指针类型一样,这里应该是他们符号的优先级高,符号的作用域小,要不然相同时定义一个int类型的引用和变量就没法了。

引用定义完之后,就可以当成是一个别名。参见引用和指针部分的例子。

最总要的一点:指针和引用要是指向常量,也要在他们前面加上const,因为编译器没那么聪明,跟踪不了指向的值,直接用const修饰,检查他们是否被赋值,如果赋值违法。

const and 指针

4种情况

int a = 5;
const int *b = &a; // b的值可变,b指向的值不可变
int *const c = &a; // c的值不可变, c指向的值可变
const int *const d = &a; // 两者接不可变

const int A = 5;
int *B = &A; // 错  如果A是const那么B必须用const修饰
const in* C = &A // 对

助记:

  1. int *是紧密在一块的, 不要弄成int const* a

  2. const 离变量越远说明和这个变量自身的属性不大,那只能是和这个变量指向的变量关系大。

const and 引用

与const and 指针情况2点不太类似

int a = 5;
const int &b = a; // b引用a, a虽然不是常量,但是由于b引用的内容被const修饰,也不能对b赋值
b = 7; // 错误, 和指针不太一样
const int c = 4;

int &d = c; // 错误, 如果被引用对象是常量(const修饰,常数),那引用变量本来就应该用const修饰
int &e = 4; // 错误

double b = 5.1;
const int & a = b; // 引用可以引用不同类型,但必须加上const

int const &a = b; // 错误,引用本来就只能赋值一次。// 和指针不一样

引用, 指针

把引用看成是别名

int a = 6;
int *b = &a;
int *&c = b;
c = 5; //错误
*c = 5; // 正确

const , 引用, 指针

引用指针

int a = 1;
int *b = &a;
const int*& c = b; // c可以改变,c改变就是b改变,但是b指向的变量不可以变, 奇怪的是这种第一无法通过编译。
int d = 5;
c = &d; // 正确
*c = 4; // 错误

// 如果最终指针指向的对象是常量,则应该写成下面的形式
const int e = 1;
const int * b = &e;
const int*& const c = b; // 错误, &应该和变量结合
const int* const &c = b; // 正确, 把c看成别名 &和变量结合,指针和类型紧密结合。就和const和指针的情况一样了

// 更常见的情况:
const int* const &f = &e; // 第二个const是必须要加上,因为指针指针指向了一个常量。

结论

  1. 指向常量的指针和索引要在最前面加上const,如果想让该指针和索引也不能变,要在变量前再加上一个const

  2. 索引符和变量结合, 指针和类型结合

const int a = 1;
const int* const &b = &a;
  1. 不存在const int* &c 只有 const int* const &c
posted @ 2022-04-22 22:14  astxh1417  阅读(40)  评论(0)    收藏  举报