直接上图,网页的表格换行麻烦,写出来格式也太丑了吧,还是看图比较清楚。
表格里的代码我都在VS2017里调试运行过。
1、顶层const
(自己本身是常量)
引用 | 指针 |
---|---|
实际上没有常量引用这种东西,因为引用不是一个对象,我们没法让引用本身恒定不变。 |
常量指针:指针本身为常量。 int a = 0; int *const p1 = &a;
|
引用没有顶层const | 1) 指针本身为常量,初始化后,则指针的值(也就是存放在指针中的那个地址)就不能再被改变了。 2) 指针本身是一个常量并不意味着不能通过指针修改其所指对象的值,能否这样做依赖于所指对象的类型。 例子: int a = 0; int *const p1 = &a; // 所指对象是非常量*p1=2; // 可以这样修改所指对象*p1的值` |
2、底层const
(所指对象是常量)
引用 | 指针 |
---|---|
对const的引用:把引用绑定到const对象上。对常量的引用不能被用作修改它所绑定的对象。 “对const的引用”简称为“常量引用”,不过你得时刻记得这就是个简称而已。 |
指向常量的指针:指针指向const对象。 |
1) 正常情况:将const int &绑定到const对象上。 例子: const int a = 1; const int &r1 = a; 2) 例外情况:引用的类型必须与引用的对象类型一致,但有两个例外:一种例外情况就是允许将const int &绑定到一个普通int对象上。 此时不能通过引用去修改被绑定对象的值,但可以通过别的方式修改对象的值。 例子: int a=0; const int &r1 = a; a =1; // 可以修改a的值,因为a是非常量3) 允许将const int &和字面值或某个表达式的计算结果绑定到一起。 const int &r2 = 2; const int &r3 = a*3;
|
1) 正常情况:让const int *指向常量对象。 例子 const int a = 1; const int *p = &a; p =nullptr; // 指针本身不是const型,可以修改2) 例外情况:指针的类型必须与所指对象的类型一致,但有两个例外:一种例外情况就是允许令一个指向常量的指针指向一个非常量的对象(就问你这句话绕不绕)。此时不能通过该指针改变对象的值,但没有规定那个对象的值不能通过其他途径改变。 例子: int a = 0; const int *p = &a; a = 1; // 可以修改a的值,因为a是非常量 |
总结:谁是const谁就不能被修改。
指针是const,指针就不能被修改(此时如果指针所指对象不是const,则对象是可以被修改的)。指针所指对象是const,所指对象就不能被修改(此时如果指针不是const,则指针是可以被修改的。)
用于声明引用的const都是底层const,因为引用不是一个对象,引用本身不会是const的。