Подтвердить что ты не робот

Трейлинг подчеркивания для переменных-членов в С++

Я видел, как люди используют конечный знак подчеркивания для переменных-членов в классах, например, в известном С++ FAQ Lite.

Я думаю, что цель не в том, чтобы отмечать переменные как члены, для чего "m_". Фактическая цель состоит в том, чтобы позволить иметь метод доступа, названный как поле, например:

class Foo {
public:
    bar the_bar() { return the_bar_; }
private:
    bar the_bar_;
}

Наличие аксессуаров опускает часть "get_", часто встречающаяся в STL и boost, и я пытаюсь разработать стиль кодирования как можно ближе к ним, но я не могу видеть их с помощью трюка подчёркивания. Я не смог найти аксессуар в STL или boost, который просто вернул бы закрытую переменную.

У меня есть несколько вопросов, на которые я надеюсь, вы сможете ответить:

  • Откуда это соглашение? Болтовня? Objective-C? Microsoft? Мне интересно.
  • Можно ли использовать конечное подчеркивание для всех закрытых членов или как обходное решение в случае, если я хочу назвать функцию как переменную?
  • Можете ли вы указать мне на STL или повышающий код, который демонстрирует завершающие символы подчеркивания для переменных-членов?
  • Кто-нибудь знает, что представляют собой взгляды Страустрапа на вопрос?
  • Можете ли вы указать мне на дальнейшее обсуждение проблемы?
4b9b3361

Ответ 1

В C++,

  1. идентификаторы, начинающиеся с подчеркивания, за которым следует заглавная буква
  2. идентификаторы, имеющие два последовательных подчеркивания в любом месте
  3. идентификаторы в глобальном пространстве имен, начинающиеся с подчеркивания

зарезервированы для реализации. (Подробнее об этом можно узнать здесь.) Вместо того, чтобы пытаться запомнить эти правила, многие просто не используют идентификаторы, начинающиеся с подчеркивания. Вот почему заключительное подчеркивание было изобретено.

Однако сам по себе C++ является старым и основан на 40-летнем опыте C (оба из которых никогда не имели ни одной компании), и имеет стандартную библиотеку, которая "выросла" за несколько десятилетий, а не была создана в единый акт творения. Это обусловливает существование множества различных соглашений об именах. Конечное подчеркивание для рядовых (или только для личных данных) - это всего лишь один, многие используют другие (не немногие среди них утверждают, что, если вам нужны подчеркивания, чтобы отличать закрытые члены от локальных переменных, ваш код недостаточно ясен).

Что касается геттеров/сеттеров - это мерзость и верный признак " квази-классов ", которые я ненавижу.

Ответ 2

Я читал "Язык программирования С++", и Stroustrup не использует каких-либо конвенций для именования участников. Ему никогда не нужно; нет ни одного простого аксессора/мутатора, у него есть способ создания очень тонких объектно-ориентированных конструкций, поэтому нет необходимости иметь метод с тем же именем. Он использует структуры с публичными членами, когда ему нужны простые структуры данных. Его методы всегда кажутся операциями. Я также где-то читал, что он запрещает использование имен, которые отличаются только одним символом.

Ответ 3

Я лично большой поклонник этого руководства: http://geosoft.no/development/cppstyle.html

Он включает в себя исключение префикса m_, используя суффикс подчёркивания, чтобы указать частные переменные-члены и отбрасывать ужасную, раздражающую привычку использовать символы подчеркивания вместо пространства, а также другие, более подробные и конкретные предложения, такие как имена bools (isDone вместо done) и используя getVariable() вместо просто variable(), чтобы назвать несколько.

Ответ 4

Только для себя... Я всегда использую trailing underscore для частных членов данных, независимо от того, имеют ли они функции доступа или нет. Я не использую m_ в основном потому, что это мешает, когда я мысленно заклинаю имя переменной.

Ответ 5

Как разработчик обслуживания, который любит поиск, я склоняюсь к m_ как к его более доступной для поиска. Когда вы, как и я, поддерживаете большие проекты с большими классами (не спрашивайте), вы иногда задаетесь вопросом: "Хм, кто мутирует государство?". Быстрый поиск m_ может дать подсказку.

Я также, как известно, использовал l_ для обозначения локальных переменных, но текущий проект не использует это, поэтому я сейчас "чист".

Я не поклонник венгерской нотации. С++ имеет сильную систему типов, я использую это вместо этого.

Ответ 6

Я предполагаю, что утопия должна была бы использовать лидирующий знак подчеркивания - это довольно часто встречается в Java и С# для членов.

Однако для C ведущие подчеркивания не являются хорошей идеей, поэтому, я думаю, рекомендация на С++ FAQ Lite для перехода к нижнему подчеркиванию:

Все идентификаторы, начинающиеся с подчеркивание и верхний регистр письмо или другое подчеркивание всегда зарезервированный для любого использования.

Все идентификаторы, начинающиеся с подчеркивание всегда зарезервировано для использования как идентификаторы с файловой областью в обоих обычные и теговые пространства имен.


(спецификация ISO C99, раздел 7.1.3)

Ответ 7

Насколько я помню, это не Microsoft, которая подталкивала стиль кода подчеркивания подчеркивания для членов.

Я прочитал, что Stroustrup является пропримкнутым подчеркиванием.