Ответ зависит от языковой версии, поскольку это изменилось с C++ 03 на C++ 11.
В C++ 03, правило было:
Члены внутри блока управления такой же доступ (то есть, от одного из public
, protected
, private
ключевых слов к следующему из этого набора) являются распределяться в порядке декларирования внутри класса, не обязательно смежным.
В C++ 11, правило было изменено следующим образом:
пользователей с уровнем управления такой же доступ (государственные, защищенные, частные) должны быть выделены в порядке объявления в классе, не обязательно смежно.
Таким образом, в C++ 03, вы можете гарантировать, что это (я использую @
означать смещение члена в классе):
@m_ac < @m_scp
@m_i1 < @m_i2 < @m_b1 < @m_b2
В C++ 11 у вас есть еще несколько гарантий:
@m_ac < @m_scp
@m_sc < @m_i1 < @m_i2 < @m_b1 < @m_b2
@m_name < @m_b3
В обеих версиях, компилятор может изменить порядок членов в разных цепях, как он считает нужным, и он может даже чередовать цепи.
Обратите внимание, что есть еще один механизм, который может войти в картину: классы стандартной компоновки.
Класс является стандартным макетом, если у него нет виртуальных машин, если все его нестатические элементы данных имеют одинаковое управление доступом, у него нет базовых классов или нестатических элементов данных типа нестандартного макета или ссылочного типа, и если он имеет не более одного класса с любыми нестатическими членами данных в своей цепочке наследования (т.е.он не может определять свои собственные нестатические элементы данных и наследовать некоторые из базового класса).
Если класс является стандартным макетом, есть дополнительная гарантия того, макет класса).
Обратите внимание, что условия стандартного макета, а также практические компиляторы, не допускающие пессимистических выборов, фактически означают, что в классе стандартного макета члены будут упорядочены в порядке объявления (с добавлением по необходимости для выравнивания при необходимости).
Избегайте «защищенных», избегайте голых указателей. –
Практически дубликат: http://stackoverflow.com/q/15763091/560648 Пожалуйста, найдите перед тем, как спросить. –