从const对象是编译时确定的角度看去

const对象必须初始化,因为编译器要在编译过程中把文件中的每个变量都替换为对应的值。
在编译时就替换?除非你用于给它初始化的东西足够简单。比如字面值、constexpr 表达式。
字面值类型也可以就此定义为 ”足够简单以至于编译时就能计算出来“ 的东西的集合。

于是有字面值类型的类。

要么直接不构造,一眼就能看出它的成分:数据成员都是字面值类型的聚合类
当一个类满足如下条件时,我们说它是聚合的:

  • 所有成员都是public的
  • 没有定义任何构造函数
  • 没有类内初始值
  • 没有基类,也没有virtual参数

要么就是构造足够简单,足以在编译时完成
如果一个类不是聚合类,符合以下要求也是一个字面值常量类:

  • 数据成员都必须是字面值类型
  • 类必须至少有一个constexpr构造函数
  • 如果一个数据成员含有类内初始值,则内置类型成员的初始值必须是一条常量表达式;如果成员属于某种类类型,则初始值必须使用成员自己的constexpr构造函数
  • 类必须使用析构函数的默认定义,该成员负责销毁类的定义

多文件用一个const

如果程序中有多个文件中要使用同一个const对象,那么在每个用了这个const对象的文件中,编译器都必须知道初始值是什么。所以每个文件都要负责提供这个const对象的初始值。

提供初始值的方式——
一种是通过定义:普通的变量可能不会要求要初始值,所以减少了重复定义的可能性。而const变量则要求初始值,所以可以预见多个文件都会对这个变量进行定义。为了避免对同一变量的重复定义,const对象被设定为仅在文件内有效(这意味着它相当于是内部链接的)。这时候所谓的同个const变量其实是不同变量被赋予了相同的值。
还有一种方法是通过显式指定,来引用外面的定义:

//file_1.cc 定义并初始化了一个常量,该常量能被其他文件访问
extern const int bufSize=fcn() ;
//file_1.h 头文件
extern const int bufSize; //与file_1.cc 中定义的 bufSize 是同一个

你可能感兴趣的:(从const对象是编译时确定的角度看去)