指针的const说明符

时间:2012-07-06 09:29:20

标签: c++ pointers const

我可以声明foo(const T& var),以便我知道var不会被更改。

指针的等效格式为foo(const T* var)

过去我尝过那些,与iterator / const_iterator相关的错误让我感到恼火,我只是倾向于使用(T* var)而不考虑常量。

是否有一个好的doc来声明函数,强制指针指向的内容不会改变'?

2 个答案:

答案 0 :(得分:7)

你所拥有的是一个禁止指针内容改变的指针。您可以使用“向后阅读”规则来查看此内容:

const T* var     <===== left to right from this read

向后读:

  

var是指向T的常量

的指针

这与

不同
T* const var

其中包括:

  

var是指向T

的常量指针

这里的区别是常量是var,而不是T;这意味着您可以通过解除引用T来更改var,但无法更改var指向的内容。

当然,你可以同时拥有上述两个:

const T* const var

答案 1 :(得分:0)

(来自2 simple variable initialization question

关于const的一个非常好的经验法则:

  

从右到左阅读声明。

(参见Vandevoorde / Josutiss“C ++模板:完整指南”)

例如:

int const x; // x is a constant int
const int x; // x is an int which is const

// easy. the rule becomes really useful in the following:
int const * const p; // p is const-pointer to const-int
int const &p;        // p is a reference to const-int
int * const * p;     // p is a pointer to const-pointer to int.

自从我遵循这个经验法则后,我再也没有误解过这样的声明。

(:sisab retcarahc-rep a no ton,sisab nekot-rep a tfel-ot-thgir naem I hguohT:tidE

同样,您可以将功能签名写入此规则:

void foo (int const * const p)

现在,p是const-int的const指针。这意味着在函数体内,你不能让p指向别的东西,即你不能改变指针,也不能改变指向的东西。

p是一个const-pointer,它实际上只与你的函数体有关,你应该从头文件中省略这些信息:

// foo.h
void foo (int const *p);

然后

// foo.cc
void foo (int const * const p) {
    // Here, the const serves you as the implementor as an additional
    // safety gear.
}