Соглашение об использовании подчеркивания в именах членов класса C ++ - PullRequest
4 голосов
/ 26 июля 2011

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

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

Например:

class Image
{
// various things

// data members
char* _data;
ImageSettings* _imageSettings;
// (and so on...)
};

Я вижу это также во многих примерах кода в Интернете,Есть ли причина этого соглашения?Извините, что не смог привести более удачных примеров, я действительно стараюсь вспомнить, но я вижу это очень много.

Мне известны венгерские обозначения, но я пытаюсь получитьобрабатывать все другие соглашения, используемые для программирования на С ++ ООП.

Ответы [ 7 ]

5 голосов
/ 26 июля 2011

Он просто предназначен для того, чтобы прояснить, какие переменные являются членами, а какие нет.Нет более глубокого смысла.Существует меньше возможностей для путаницы при реализации функций-членов, и вы можете выбрать более краткие имена.

void Class::SomeFunction() {
    int imageID;
    //...
    SetID(imageID + baseID); //wait, where did baseID come from?
}

Лично я ставлю подчеркивание в конце вместо начала [если вы случайно добавите заглавную букву к нижнему подчеркиванию, ваш код станет плохо сформированным).Некоторые люди ставят mBlah или m_Blah.Другие вообще ничего не делают и явно используют this->blah для указания своих переменных-членов, когда возможна путаница.Там нет глобального стандарта;просто делайте то, что вы хотите для частных проектов, и придерживайтесь существующих практик в других местах.

4 голосов
/ 26 июля 2011

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

Более обычный способ, который я видел, это ставить m_; т.е. m_data;

3 голосов
/ 26 июля 2011

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

Это полезный язык, который не имеет встроенного способа объявить членов закрытыми, как python.

1 голос
/ 26 июля 2011

Обычно в переменных-членах используется подчеркивание, чтобы различать переменные-члены, статические переменные-члены и локальные переменные.

m_ используется для обычных переменных-членов &
s_ для статических переменных-членов

Таким образом область видимости переменной видна в самом имени переменной.


Кроме того, иногда в имени элемента используется подчеркивание, чтобы вы могли называть свои методы get и set именем самого элемента.

Например:

class Image 
{ 
    // various things  
    // data members 
    char* _data; 
    ImageSettings* _imageSettings; 
    // (and so on...) 
    public: 
    ImageSettings* imageSettings()
    {
        //return pointer
    }
    void imageSettings(ImageSettings *ptr)
    {
        //set member variable value
    }
}; 

Однако в разных организациях применяются разные соглашения и стили кодирования, и их следует придерживаться. Следуй принципу
Когда вы в Риме, думайте и ведите себя как римляне:)

1 голос
/ 26 июля 2011

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

Для справки: Стиль Google C ++ для именования

0 голосов
/ 26 июля 2011

Причиной этого соглашения является то, что имена членов, начинающиеся с подчеркивания, отображаются первыми в Intellisense. Как правило, вы должны следовать соглашению проекта, который вы вносите. Если вы начинаете новый проект, рекомендуется следовать общепринятым соглашениям, таким как C ++ Standards Sutter и Alexandrescu .

0 голосов
/ 26 июля 2011

Что я узнал, так это то, что наличие подчеркивания до или после переменной означает, что она является членом этого класса - частным, общедоступным или защищенным.

...