20

在以下程序主体中包含一个指针向量。Points 是 x,y,z 坐标和 point_id 的结构。我相信由于 body 是通过 const 引用传递的,因此以下步骤应该会产生错误。但是程序运行没有任何问题。你能解释一下为什么会这样吗?

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

    ....

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

4 回答 4

39

这是问题:

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

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

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)
于 2012-06-11T08:36:30.943 回答
16

这是说明原因的最佳示例之一data members should not be public

在这里,body是常量,因此它的数据成员不能更改,但body.bp[0]->points重点是正在更改,它不是 .Body因此没有违反 const 的成员。

于 2012-06-11T08:43:19.060 回答
6

只有body是恒定的。

body.bp[0]->points不会受到恒定性的影响body

于 2012-06-11T08:36:04.710 回答
6

是的,body是恒定的。这意味着不能调用非常量成员函数,也不能修改成员变量。

两者都没有完成。used的唯一成员bodybody.bp[0],它也没有改变,而只是用于获取points,这可能是也可能不是恒定的......

推论:不要公开数据成员。

于 2012-06-11T08:37:26.703 回答