这次学习的是const,C++是一种很坑爹的东西,连const都能玩出这么多的花样。

const 限定符

  1. const的对象一旦被创建后,其值就不能再改变,所以const对象必须初始化,似乎所有的创建后就不能改变的东西(为什么说东西而不是对象,因为引用不是对象),例如引用
  2. const的对象是一个有原则的对象,只要不让改变其自身,就和其他对象没啥差别,我们是不是应该把const的对象成为老顽固,因为老顽固一般不会去改变自身
  3. 因为每个文件都需要自己的const对象,而且显然这些文件可能由不同的人来写,那么const的命名上很有可能会冲突,所以const对象的作用域在文件。但如果想要多个文件共用一个const对象,那么就需要使用extern,这里的共用是说不需要include对应的文件,也能获取到对应的值。

const的引用

  1. 显然const对象是一个对象,所以可以创建const对象的引用,但是const对象的引用是不可修改。
  2. 需要常量引用绑定一个非常量的对象、表达式,因为对于编译器来说,会先将非常量转成常量,这是会生成一个临时量,再将临时量赋值给常量引用,这是常量引用绑定的是临时量,跟原来的非常量没啥关系。所以需要注意的是这种做法是语法上过得去,但是没用,谁会去绑定一个临时量。

指针和const

  1. 指向常量的指针,应该说指针认为自己是指向常量,所以他认为他自己不可以被修改,但是至于他指向的是不是常量,就不一定了。
  2. 常量指针,必须初始化,因为就想上面说的,一旦被初始化,就不能在指向其他的对象。至于能不能通过常量指针修改对象取决于被指向的对象。

顶层const 和 底层const

  1. 因为指针本身是个对象,所以他可以被定义成const,这个const被称作顶层const,而他又可以指向对象,被指向的对象也可被定义为const,这个const被称作底层const。
  2. 顶层const并不只是针对指针,而是针对对象,因为任何一个对象都可以被定义为const,而底层const则只针对引用和指针
  3. 顶层const对象只要不改变自身,没什么限制。但是底层const进行拷贝操作时,就必须和自己同样的类型或者可以被转换,所谓的转换也只是针对非常量转换成常量,但是基本类型还是需要一致的。

常量表达式和constexpr

  1. 常量表达式是指不会改变并且在编译过程就能得到计算结果的表达式。。我已经有点受够C++的一大串的术语。
  2. 可能是某些地方需要用到常量表达式,所以这时候就需要去确定某个表达式是不是常量表达式,人工判断有点坑,所以就需要constexpr来判断,如果不是编译过不了
  3. 字面值类型指的就是那些简单的类型,算数类型,引用,指针。

ps:我真的很不明白constexpr有什么用。。或许后面就知道,我自己还是太low了。
部分文字来自《C++ Primer》