C++ Primer:常量引用、引用常量、常量指针、指针常量


网上说法:

代码 名称 含义
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
指针本身是常量

总结

  1. 常量引用规定不能通过引用修改其所绑定的对象,但能以其它方式修改这个对象。
    int i = 1;
    const int &r = i; //r绑定i,其后对r的操作实际上是针对i进行的
    r = 2;            //错误,不能通过修改r来实现对i的修改
    i = 2;            //i可修改
  1. 不存在引用常量。因为引用只能在初始化时绑定一个对象(左值),之后不能再重新绑定其它对象,对引用的操作实际上都是对引用绑定的对象进行操作,即绑定关系已不可更改,用const修饰引用本身无意义。
    int i = 1;
    int &const r = i;

运行错误

  1. 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 *
  1. 区分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是常量
  1. 常量指针在网上和书中说法不同。建议除非必要,将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

参考博客:理清C++常量指针和指针常量这团乱麻(里面讲得很详细,值得一看)

你可能感兴趣的:(#,C++,Primer)