为什么在引用(const指针)可用时使用const关键字声明一个常量指针?

时间:2011-12-05 20:11:04

标签: c++ pointers reference const constants

例如:

我可以创建一个常量指针,指向一个可以通过指针更改的对象。指针无法重新分配:

MyObj const *ptrObj = MyObj2 

为什么我会使用它:

MyObj &ptrObj = MyObj2

3 个答案:

答案 0 :(得分:4)

你所拥有的不是const指针,它是指向const对象的指针 - 也就是说,指针可以改变,但对象不能。 const指针将是:

MyObj *const ptrObj = &MyObj2;

至于为什么你可能更喜欢它而不是引用,你可能希望灵活地使用NULL特殊值作为某些东西 - 你没有通过引用得到它。

答案 1 :(得分:2)

你弄错了。你拥有的是可变指向常量对象的指针:

T const * p;
p = 0;            // OK, p isn't const
p->mutate();      // Error! *p is const
T const & r = *p; // "same thing"

你真正想要的是常量指向 mutable 对象的指针:

T * const p = &x; // OK, cannot change p
T & r = x;        // "same thing"
p->mutate();      // OK, *p is mutable

实际上,引用在道德上等同于常量指针,即T & vs T * const,常量版T const & vs T const * const

如果你坚持要求一些建议,那么我会说,“不要使用指针”。

答案 2 :(得分:1)

指针和引用之间的重要区别在于它们可以引用多少个对象。引用总是指一个对象。指针可以指零(当指针为空时),一个(当指针指定单个对象的位置时)或n个对象(当指针指向数组内的某个点时)。

指针引用0到n个对象的能力意味着指针在它可以表示的内容方面更灵活。当指针的额外灵活性不是必需的时,通常最好使用引用。这样,读取代码的人不必确定指针是指零,一个还是n个对象。