在以下程序主体中包含一个指针向量。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));
}
在以下程序主体中包含一个指针向量。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));
}
这是问题:
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)
这是说明原因的最佳示例之一data members should not be public
。
在这里,body
是常量,因此它的数据成员不能更改,但body.bp[0]->points
重点是正在更改,它不是 .Body
因此没有违反 const 的成员。
只有body
是恒定的。
body.bp[0]->points
不会受到恒定性的影响body
是的,body
是恒定的。这意味着不能调用非常量成员函数,也不能修改成员变量。
两者都没有完成。used的唯一成员body
是body.bp[0]
,它也没有改变,而只是用于获取points
,这可能是也可能不是恒定的......
推论:不要公开数据成员。