const int bufSize = 512;
,编译器将在编译过程中把用到该变量的地方都替换成对应的值,也就是说,编译器会找到代码中所有用到bufsize的地方,然后用512替换//定义并初始化了bufSize,因为他是一个常量,必须使用extern使其可以被其他文件使用
extern const int bufSize = fcn();
//此处下面的bufSize则是一个声明
extern const int bufSize;
const int a = 1024;
const int &b = a; //引用及其对象都是常量
b = 42; //错误,b是对常量的引用
int &c = b; //错误,试图让非常量引用指向常量对象
因为不允许改变a的值,因此也不能通过引用的方式去改变它,所以引用他的也一定是常量
引用的类型必须与其所引用对象的类型一致,只有两个例外,这里说其中一个
int i = 42;
const int &a = i; //正确,允许将一个const int&绑定到普通int对象
const int &b = 42; //正确,b是一个常量引用
const int &c = a * 2; //正确,c是一个常量引用
int &d = a * 2; //错误,r4是一个非常量引用
const int &c = a * 2
这个语句,为了确保c可以绑定到一个数,编译器采用的方法是将他变为·int tmp = a * 2; const int &c = tmp
,这样,c就绑定了一个临时量对象,所谓临时量对象就是编译器需要一个空间来暂存表达式的求职结果时候创建的未命名对象。int i = 42;
int &a = i;
const int &b = i;
a = 0; //正确
b = 0; //错误,因为b是一个常量引用
如上,用一个常量引用去引用一个非常量对象,作用是使得不能通过修改引用的方式修改对象的值,但是依然可以通过其他的方法,比如直接给i赋值的行为,去修改对象的值
const double PI = 3.14;
double *ptr = Π //错误,ptr不是常量指针,是普通指针
const double *dptr = Π //正确,dptr是一个常量指针
*dptr = 42; //错误,不能给*dptr赋值
所谓常量指针,常量引用,可以理解为指针和引用自以为指向了一个常量,所以自觉地不去改变对象的值
int errNum = 0;
int *const curErr = &errNum; //一个指向errNum的常量指针
const double PI = 3.14159;
const double *const pip = *pi;
int i = 0;
int *const p1 = &i; //常量指针,不能改变p1的值,顶层const
const int ci = 42; //常量,不能改变ci的值,顶层const
const int *p2 = &ci; //允许改变p2的值,这是一个底层const
const int *const p3 = p2; //一个指向const int的常量指针,靠右的const是底层const,靠左的是顶层const
const int &r = ci; //指向const int的引用,底层const
i = ci; //拷贝ci的值,ci是一个顶层const,无影响
p2 = p3; //拷贝p3的值,p2和p3指向的对象类型相同,p3顶层const不受影响
int *p = p3; //错误,p3包含底层const定义,p没有
p2 = p3; //正确,p2,p3都是底层const
p2 = &i; //正确,int*可以转化为const int *
int &r = ci; //错误,r没有底层const
const int &r2 = i; //可以,const int &可以绑定在普通int上
const int max_files = 20; //是常量表达式
const int limit = max_files + 1; //是常量表达式
int staff_size = 27; //不是常量表达式,因为staff_size不是常量
const int sz = getsize(); //不是常量表达式,因为getsize()不是常量
constexpr int mf = 20; //20是常量表达式
constexpr int limie = mf + 1; //mf + 1是常量表达式
constexpr int sz = size(); //只有当size()是一个constexpr函数时才是一条正确的声明语句
const int *p = nullptr; //p是一个指向整型常量的指针
constexpr int *q = nullptr; //q是一个指向整数的常量指针
其中关键在于constexpr把他定义的对象置为了一个顶层const
constexpr int *np = nullptr; //np是一个指向整型的常量指针
int j = 0;
constexpr int i = 42; //i是一个整型常量
constexpr const int *p = &i; //p是一个指向整型常量的常量指针
constexpr int *p1 = &j; //p1是一个指向整形的常量指针
文章内容参考C++ Primer
原文:https://www.cnblogs.com/Hugh-Locke/p/12866856.html