网上说法:
代码 | 名称 | 含义 |
---|---|---|
const int &r int const &r |
常量引用 reference to const |
绑定常量的引用 |
int &const r | 引用常量 | 不存在该说法,代码运行错误 |
const int *p int const *p |
常量指针 pointer to const |
指向常量的指针 |
int *const p | 指针常量 const pointer |
指针本身是常量 |
C++primer:
代码 | 名称 | 含义 |
---|---|---|
const int &r int const &r |
常量引用 reference to const |
对const的引用 |
int &const r | 引用常量 | 不存在该说法,代码运行错误 |
const int *p int const *p |
指向常量的指针 pointer to const |
指向常量的指针 |
int *const p | 常量指针 const pointer |
指针本身是常量 |
总结
- 常量引用规定不能通过引用修改其所绑定的对象,但能以其它方式修改这个对象。
int i = 1;
const int &r = i; //r绑定i,其后对r的操作实际上是针对i进行的
r = 2; //错误,不能通过修改r来实现对i的修改
i = 2; //i可修改
- 不存在引用常量。因为引用只能在初始化时绑定一个对象(左值),之后不能再重新绑定其它对象,对引用的操作实际上都是对引用绑定的对象进行操作,即绑定关系已不可更改,用const修饰引用本身无意义。
int i = 1;
int &const r = i;
- const int &r等价于int const &r,const int *p等价于int const *p。程序一般会将int const转换成const int,所以const int更常用。
int i = 1;
const int &r1 = i;
int const &r2 = i;//r2的类型:const int &
const int *p1 = &i;
int const *p2 = &i;//p2的类型:const int *
- 区分const int *p和int *const p,关键看const。const在*前,说明const修饰的是类型,指针指向常量。const在*后,说明const修饰的是指针,指针是本身是常量。
int i = 1;
const int *p1 = &i; //const修饰int,则p1指向const int
int *const p2 = &i; //const修饰p2,则p2是常量
- 常量指针在网上和书中说法不同。建议除非必要,将const int *p称为指向常量的指针,将int *const p称为本身是常量的指针。这样虽然麻烦点,但意思不会错,也不会弄混。
int i = 1;
const int *p1 = &i; //指向常量的指针
int *const p1 = &i; //本身是常量的指针
个人常用名称:
代码 | 名称 |
---|---|
const int &r int const &r |
绑定常量的引用、对常量的引用、常量引用 reference to const |
int &const r | 引用常量不存在 |
const int *p int const *p |
指向常量的指针 pointer to const |
int *const p | 本身是常量的指针 const pointer |
const int *const p | 本身和所指对象都是常量的指针 |
int *&r | 绑定指针的引用、对指针的引用 const pointer |