С++ передача по ссылке const
В следующем программном теле косификаторы вектора указателей. Точки - это структура координат x, y, z и point_id. Я считаю, что тело передается ссылкой const, следующий шаг должен приводить к ошибке. BUt программа работает без проблем. Не могли бы вы объяснить мне, почему это.
void readOutFile(const Body& body, int n){
....
body.bp[0]->points.push_back(Point_id(p,i));
}
Ответы
Ответ 1
Здесь проблема:
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)
Ответ 2
Это один из лучших примеров, который показывает, почему data members should not be public
.
здесь, body
является постоянным, поэтому его члены данных не должны меняться, но в body.bp[0]->points
изменяется точка, которая не является членом body
. Не имеет значения const const.
Ответ 3
Только body
является константой.
body.bp[0]->points
не зависит от постоянной body
Ответ 4
Да, body
является постоянным. Это означает, что не могут быть вызваны не константные функции-члены, и никакие переменные-члены не будут изменены.
Ничего не делается. Единственным членом body
является body.bp[0]
, который тоже не изменен, а просто используется для доступа к points
, который может быть или не быть постоянным...
Corrolary: не публиковать данные.