2012-06-11 104 views
20

在以下程序体指针向量的体协助者中。点是x,y,z坐标和point_id的结构。我相信由于const通过const引用传递,下面的步骤应该会产生一个错误。该程序运行没有任何问题。你能解释我为什么这样。通过const引用传递的C++

void readOutFile(const Body& body, int n){ 

    .... 

    body.bp[0]->points.push_back(Point_id(p,i)); 
} 
+2

'body'作为'const'传递,但编译器无法知道'body.bp [0] - > points'也应该是'const'。 – wroniasty

+0

它会运行正常,const错误将是编译时错误,而不是运行时错误。 –

+3

在C++中,const很浅,不深。所以它会影响对象而不影响它的关联。这意味着你只能调用const方法。但const方法可以改变其他对象,总是使用接口中的方法,并使用一个良好的lint工具来检查深层const。 –

回答

6

只有body是恒定的。

body.bp[0]->points没有办法受到的body

38

这里constantness对这个问题:

body.bp[0]->points.push_back(Point_id(p,i)); 
      ^^ 

通过指针Indirecting删除任何常量性;相反,结果的常量取决于指针的类型。

T *t;    // pointer to T: can modify t and (*t) 
const T *t;  // pointer to const-T: can modify t but not (*t) 
T *const t;  // const-pointer to T: can modify (*t) but not t 
const T *const t; // const-pointer to const-T: can't modify either t or (*t) 
+3

我从来没有意识到这一点,但它是有道理的。 Constness传播到成员指针,但不是它的内容。 –

6

是的,body是恒定的。这意味着不可以调用非const成员函数,也不会修改任何成员变量。

两个都没有完成。的body使用的唯一成员是body.bp[0],它也不会被改变,而只是用于获取在points,这可能是也可能不是恒定的......

Corrolary:不要让数据成员公开。

16

这是最好的例子之一,它显示了为什么data members should not be public

这里,body是恒定的,因此它的数据成员必须不被改变,但是在body.bp[0]->points点正在改变其不是的Body .Hence没有常违反构件。

+5

对我来说,这是为什么**成员指针**不应该公开的例子。公共“有价值”数据成员没有错。 – ulidtko