Вопрос по pass-by-const-reference, c++ – c ++ передача по константной ссылке

20

В следующей программе тело состоит из вектора указателей. Точки - это структура координат x, y, z и point_id. Я полагаю, что поскольку тело передается по константной ссылке, следующий шаг должен привести к ошибке. Но программа работает без проблем. Не могли бы вы объяснить, почему это так?

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

    ....

    body.bp[0]->points.push_back(Point_id(p,i));
}
body передается какconst но компилятор не может знать, чтоbody.bp[0]->points должно бытьconst также. wroniasty
@Richard Что значит "const"? есть ли понятие: неглубокий и глубокий конст? zinking
Глубокая и неглубокая константа, как глубокая и неглубокая копия. Мелкий относится только к объекту. Глубокий относится к объекту и ко всем объектам, к которым он относится. И.Е. Неглубокая константная коллекция / объект - это инвариантная коллекция / объект вариантных объектов. Глубокая константная коллекция / объект является инвариантной коллекцией / объектом глубоких константных объектов. (обратите внимание на рекурсивное определение). Также обратите внимание, что если объект имеет глубокий констант, он прошел бы неглубокий тест констант. (это не относится к копии) ctrl-alt-delor
Он будет работать нормально, и ошибка const будет ошибкой времени компиляции, а не ошибкой времени выполнения. ctrl-alt-delor
В C ++ const неглубокий, а не глубокий. Так что это влияет на объект, но не на его ассоциации. Это означает, что вы можете вызывать только методы const. Но методы const могут изменять другие объекты, всегда использовать методы в интерфейсе и использовать хороший инструмент lint для проверки глубокого const. ctrl-alt-delor

Ваш Ответ

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)
Я никогда не осознавал этого, но это имеет смысл. Constness распространяется и на указатель на член, но не на его содержимое.
16

data members should not be public.

Вот,body является постоянным, следовательно, его члены данных не должны быть изменены, но вbody.bp[0]->points точка меняется, которая не является членомBody.Нет, не констатировать нарушение.

Для меня это пример того, почемуmember pointers не должно быть публичным. Нет ничего плохого в общедоступной & quot; стоимости & quot; члены данных.
6

body постоянно.

body.bp[0]->points никак не зависит отconstantness изbody

6

Да,body постоянно. Это означает, что никакие неконстантные функции-члены не могут быть вызваны, и никакие переменные-члены не могут быть изменены.

Ни то, ни другое не делается. Единственный членbody используетсяbody.bp[0], который также не изменяется, а просто используется дляpoints, который может или не может быть постоянным ...

Corrolary: не делайте членов данных публичными.

Похожие вопросы