在以下程序体指针向量的体协助者中。点是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));
}
在以下程序体指针向量的体协助者中。点是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));
}
只有body
是恒定的。
body.bp[0]->points
没有办法受到的body
这里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)
我从来没有意识到这一点,但它是有道理的。 Constness传播到成员指针,但不是它的内容。 –
是的,body
是恒定的。这意味着不可以调用非const成员函数,也不会修改任何成员变量。
两个都没有完成。的body
使用的唯一成员是body.bp[0]
,它也不会被改变,而只是用于获取在points
,这可能是也可能不是恒定的......
Corrolary:不要让数据成员公开。
这是最好的例子之一,它显示了为什么data members should not be public
。
这里,body
是恒定的,因此它的数据成员必须不被改变,但是在body.bp[0]->points
点正在改变其不是的Body
.Hence没有常违反构件。
对我来说,这是为什么**成员指针**不应该公开的例子。公共“有价值”数据成员没有错。 – ulidtko
'body'作为'const'传递,但编译器无法知道'body.bp [0] - > points'也应该是'const'。 – wroniasty
它会运行正常,const错误将是编译时错误,而不是运行时错误。 –
在C++中,const很浅,不深。所以它会影响对象而不影响它的关联。这意味着你只能调用const方法。但const方法可以改变其他对象,总是使用接口中的方法,并使用一个良好的lint工具来检查深层const。 –