2012-06-11 2 views
20

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

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

    .... 

    body.bp[0]->points.push_back(Point_id(p,i)); 
} 
+2

'body' передается как' const', но компилятор не знает, что 'body.bp [0] -> points' должен быть' const'. – wroniasty

+0

Он будет работать нормально, а ошибка const будет ошибкой времени компиляции, а не ошибкой времени выполнения. –

+3

В C++ константа неглубокая, а не глубокая. Таким образом, он воздействует на объект, но не на его ассоциации. Это означает, что вы можете вызывать только вызовы методов const. Но методы const могут изменять другие объекты, всегда использовать методы в интерфейсе и использовать хороший инструмент lint для проверки глубины const. –

ответ

6

Только body постоянный.

body.bp[0]->points никоим образом не влияет на constantness из body

38

Вот вопрос:

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) 
+3

Я никогда не осознавал этого, но это имеет смысл. Константа распространяется на указатель-член, но не на его содержимое. –

6

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

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

Corrolary: Не заставляйте пользователей данных общественности.

16

Это один из лучших примеров, который показывает, почему data members should not be public.

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

+5

Для меня это пример того, почему ** указатели членов ** не должны быть общедоступными. Нет ничего плохого в публичных «значениях» данных. – ulidtko

 Смежные вопросы

  • Нет связанных вопросов^_^