const、引用与指针

前提

我们忽略掉了相同类型(修饰符都一样)是否可以赋值的情况(我到现在的学习里都还可以相互赋值),以及类型兼容的情况。只考虑const、&、*等修饰符带来的影响(本来发过一篇,但不全面还有点绕,所以重写了)

类型兼容:

  • 强制类型转换
  • 基类与子类间的兼容
  • 类的构造函数类型兼容(构造函数的参数类型可以转换为该类的类型,仅转换一次)

前置const与后置cconst

const:

  • const初始化的变量要必须绑定一个值(变量还是常量都行)
  • 这个绑定值可以隐式或者显示,大部分时候用显示更安全
  • eg:string等容器,使用构造函数可以进行隐式默认初始化,const string str;就是合法的

前置const:
前置const写在其他修饰符前面,也就是距离变量较远的地方

  • 此类const修饰的变量一般指向的对象可以是变量也可以是常量
  • 不可修改指向的对象
  • 也不可以将该变量赋值给同类型的无const修饰的变量

后置const:

  • 用此类const修饰的变量,变量都会变为常量
  • 常量是右值,不能进行赋值操作

const指针

指针:

  • 会有自己的空间
  • 指向目标对象

const type *ptr

此ptr 认为 自己指向的是一个常量,不能改变所指对象的值,但还是可以释放掉内存,该ptr也是一个变量(左值),可以进行赋值,但不能让它赋值给无const修饰的同类型的指针

type *const ptr

该ptr是常量(右值), 不接受赋值,ptr现在也变成了const常量

const引用

(无const修饰)引用:

  • 必须绑定一个左值
  • 取的另一个别名
  • 只能初始化进行绑定一次

const type &temp = variate

variate可以是常量,也可以是变量,temp不能改变

(const type &temp 可以绑定右值,但是右值不一定都是const类型,这样绑定后可能会使得temp失去原来右值的部分功能)

type & const temp = variate

应该会报错,从temp往左看,const说明temp是常量无法被赋值,&说明要绑定一个左值,两者自相矛盾

猜你喜欢

转载自www.cnblogs.com/Liberavi/p/11767357.html