Конечные подчеркивания для переменных-членов в C ++ - PullRequest
40 голосов
/ 06 сентября 2010

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

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

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

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

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

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

Ответы [ 7 ]

32 голосов
/ 06 сентября 2010

В С ++,

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

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

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

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

16 голосов
/ 28 сентября 2010

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

12 голосов
/ 06 сентября 2010

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

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

9 голосов
/ 06 сентября 2010

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

4 голосов
/ 06 сентября 2010

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

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

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

3 голосов
/ 06 сентября 2010

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

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

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

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


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

1 голос
/ 06 сентября 2010

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

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

...