20

In the following program body cosists of a vector of pointers. Points is a struct of x,y,z coordinates and a point_id. I believe as body is passed by const reference, the following step should produce an error. BUt the program is running without any problem. Can you please explain me why is this.

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));
          ^^

ポインターを介して間接的に指定すると、constness が削除されます。むしろ、結果の定数はポインターの型に依存します。

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

これは、その理由を示す最良の例の 1 つですdata members should not be public

ここで、bodyは定数であるため、そのデータ メンバーを変更してはなりbody.bp[0]->pointsませんが、のメンバーではない点で変更されていBodyます。

于 2012-06-11T08:43:19.060 に答える
6

はい、body一定です。つまり、非constメンバー関数を呼び出すことはできず、メンバー変数を変更することもできません。

どちらも行われていません。bodyusedの唯一のメンバーはですbody.bp[0]。これも変更されpointsませんが、で取得するために使用されます。これは一定である場合とそうでない場合があります。

裏付け:データメンバーを公開しないでください。

于 2012-06-11T08:37:26.703 に答える
6

のみbodyが一定です。

body.bp[0]->pointsの一定性に影響されることはありません。body

于 2012-06-11T08:36:04.710 に答える