常量 (Constant)
1. 常量
常量是程序中一块数据,这个数据一旦声明后就不能被修改了。
如果这块数据有一个名字,这个名字叫做命名常量;比如 const int A = 42; 其中A就是命名常量;
如果这块数据(这个常量)从字面上看就能知道它的值,那它叫做“字面常量”,比如上面例子中的“42”就是字面常量
2. 编码规范
-
Named constants (including enumeration values) must be all uppercase using underscore to separate words.
-
符号常量(包括枚举值)必须全部大写并用下划线分隔单词
例如:MAX_ITERATIONS, COLOR_RED, PI
常量和指针(Constant and Pointer)
常量和指针搅合在一起,成为一个比较麻烦的问题。就像你想分清楚“己巳已”不容易一样,想搞清楚“指针常量”、“常量指针”、“常量指针常量”这种拗口的东西,总得花点心思。
问题还不是记性好不好,因为指针和常量搅合在一起,还涉及到函数传参、C风格数组、字符串常量这些应用场景,就更得仔细一些。所以,你应该仔细看看代码示例的演示视频。
1. 指针
指针是一个地址,它长得像 0x8FFF 这个样子。地址呢,就是某个内存位置的一个编号。那这个位置的内存是可以存放一些数据的。这些数据就叫做“指针所指的数据”或者“指针指向的数据”
2. 常量和指针
我们把指针放到一个变量里面,就是指针变量;
我们把指针放到常量中,就是指针常量;
那如果一个指针(也就是地址,比如0x8FFF)所指的数据(也就是0x8FFF这个内存位置存放的数据)是常量,这个指针被称为常量指针。
所以,有一种东西,叫做“常量指针常量”。就是说,一个常量中存着一个指针,这个指针又指向另外一个常量。
3. Pointer to Constant (常量指针/常指针)
特征:指针所指向的内容不可以通过指针的间接引用(*p)来改变。
const int x = 1;
const int* p1;
p1 = &x; //指针 p1的类型是 (const int*)
*p1 = 10; // Error!
char* s1 = “Hello”; // Error!
const char* s2 = “Hello”; // Correct!
4. Pointer Constant (指针常量)
“指针常量”的含义是:指针本身的内容是个常量,不可以改变
int x = 1, y = 1;
int* const p2 = &x; //常量 p2的类型是 (int*)
*p2 = 10; // Okay! à x=10
p2 = &y; // Error! p2 is a constant
5. 指针和常量的总结
const int * x
int * const y
在前先读,在前不变
- (指针)和 const(常量) 谁在前先读谁 ;* 代表被指的数据,名字代表指针地址
const在谁前面谁就不允许改变。
Usage of using, typedef, and #define (using, typedef, and #define的用法)
1. using 声明新的类型名称
当我们声明这样一些变量时:
const unsigned long int * p;
const unsigned long int * q;
const unsigned long int * r;
我们会觉得很麻烦。
那有没有一种办法使得 p, q, r的类型声明简便一点呢?
我们在C语言里面学了 typedef,它可以声明一个新的类型名。
typedef const unsigned long int * MyPointer;
MyPointer p;
C++11中为 using 关键字赋予了一个类型声明的新功能
using ConstPointer = const unsigned long int *;
ConstPointer p;
ConstPointer q;
ConstPointer r;
using的写法比typedef的写法更加直观,所以,我们应尽量使用using声明新类型名。而且当涉及到模版类型名时,只能使用using。
2. 编码规范
Names representing types must be in mixed case starting with upper case.
代表类型的名字必须首字母大写并且其它字母大小写混合
例如:Line, SavingsAccount