Это неоднозначно или прекрасно подходит это?

Этот код неоднозначен или прекрасно подходит это (утвержденный стандартами / последовательное поведение для каких-либо существующих компиляторов)?

struct SCustomData {
    int nCode;
    int nSum;
    int nIndex;
    SCustomData(int nCode, int nSum, int nIndex)
        : nCode(nCode)
        , nSum(nSum)
        , nIndex(nIndex)
    {}
};

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

5
задан Afriza N. Arief 29 January 2010 в 17:39
поделиться

6 ответов

Нет, в этом случае нет неоднозначности, но рассмотрим следующее:

struct SCustomData {
//...
    void SetCode(int nCode)
    {
            //OOPS!!! Here we do nothing!
            //nCode = nCode;

            //This works but still error prone
            this->nCode = nCode;
    }
};

Вы должны привлечь внимание к одному из существующих стилей кодирования. Например, правило общего именования в стилях кодирования Google C ++ или прочитать отличную книгу « Стандарты кодирования C ++: 101 правила, руководящие принципы и лучшие практики « Герб Саттер и Андрей Александреску.

6
ответ дан 18 December 2019 в 14:46
поделиться

Ваш пример недвусмысленнее (для меня), но это не очень хорошая практика, потому что он может быстро стать как администрации.

Это долгое время, поскольку я написал любой C ++ в гневе, поэтому я предполагаю, что сделает следующее.
Вы знаете Что это будет делать? Вы уверены, что?

class Noddy
{
    int* i;
    Noddy(int *i)
    : i(i)
    {
        if(i == NULL)
            i = new int;
    }
};
4
ответ дан 18 December 2019 в 14:46
поделиться

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

struct SCustomData {
    int _nCode;
    int _nSum;
    int _nIndex;
    SCustomData(int nCode, int nSum, int nIndex)
        : _nCode(nCode), _nSum(nSum), _nIndex(nIndex)
    {}
};

// Alternatively
struct SCustomData {
    int _nCode;
    SCustomData(int nCode)
    {
        this->_nCode = nCode;
    }
};

Я не люблю укладывать переменные, как это было написано в этом вопросе. Мне нравится сохранять вертикальное пространство, и мне также легче читать слева направо. (Это личное предпочтение моего, а не обязательное правило или что-то подобное.)

1
ответ дан 18 December 2019 в 14:46
поделиться

Я бы сказал, что это совершенно нормально.

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

1
ответ дан 18 December 2019 в 14:46
поделиться

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

0
ответ дан 18 December 2019 в 14:46
поделиться

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

Если вам нужно получить доступ к членам в теле конструктора, будьте осторожны - либо дайте аргументам разные имена, либо используйте this -> для доступа к членам.

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

1
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: