指向常量的指针不能用于改变其所指对象的值,存放常量对象的地址,只能使用指向常量的指针。
允许令一个指向常量的指针指向一个非常量对象。指向常量的指针仅仅要求不能通过该指针改变对象的值。
指针是对象而引用不是,允许把指针定义为常量。常量指针必须初始化,完成初始化后值(指向的地址)不能改变;将*放在const之前说明指针是一个常量。
从右向左阅读,弄清楚声明的含义。
指针是一个对象,同时可以指向另一个对象,顶层const表示指针本身是常量,底层const表示指针所指对象是一个常量。
- 用于声明引用的const都是底层const
常量表达式:值不会改变并且在编译过程就能得到计算结果的表达式。t
C++11标准允许将变量声明为constexpr类型由编译器验证变量的值是否是一个常量表达式。constexpr声明中允许定义一个指针,constexpr对指针有效,与指针所指的对象无关:
/*
* p是一个指向常量的指针,而q是一个常量指针,constexpr把它所定义的对象置为顶层const
*/
const int *p = nullptr;
constexpr int *q = nullptr;
typedef char *pstring;
const pstring cstr = 0; // cstr是指向char的常量指针
const pstring *ps; // ps是指针,它的对象是指向char的常量指针
C++11中auto类型说明符让编译器替分析表达式所属的类型,auto定义的变量必须有初始值。auto一般忽视顶层const,保留底层const,通过明确指出方式保留auto类型的是一个顶层const,
const auto f = ci;
decltype类型指示符:从表达式类型推断定义的变量类型,而不使用该表达式的值初始化变量。decltype
C++疑惑代码
char *const node_memory = arena_->allocate();
return new (node_memory) Node(key); //类前面的(node_memory)作用是什么?