C ++: списки инициализации / соглашения об именах - PullRequest
8 голосов
/ 30 января 2011

Следующий код работает на моей машине, но это хорошая практика / гарантированно работает?

struct MyStruct {
   MyStruct(int x, int y, int z) :
       x(x),
       y(y),
       z(z) {
   }

   int x;
   int y;
   int z;
};

В частности, гарантированно ли x (x) делать то, что я хочу? (то есть переменная в списке инициализации всегда смотрит на этот член структуры / класса?)

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

Спасибо!

Ответы [ 3 ]

11 голосов
/ 30 января 2011

Да, это гарантированно будет делать то, что вы ожидаете.

Единственное, что может существовать "вне" скобок в списке инициализатора - это переменные-члены.А внутри скобок применяются обычные правила;локальные переменные скрывают переменные-члены.

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

2 голосов
/ 30 января 2011

Пока он ожидает, что вы делаете, представьте себе эту ситуацию по расширению:

class MyStruct {
public:
   MyStruct(int x, int y, int z)
   :   x(x),
       y(y),
       z(z) 
   {   }
   int x() const;
   int y() const;
   int z() const;

private:
   int x;
   int y;
   int z;
};

Что не будет работать.Вот почему я ставлю своим ученикам префикс m_.Это позволяет очень читаемый код с подсказкой читателю, что рассматриваемый идентификатор является частью класса.Нефиксированные идентификаторы являются либо аргументами функции (как в списке инициализатора конструктора: m_x(x), либо локальными переменными функции).

0 голосов
/ 30 января 2011

Да, х (х) делает именно то, что вы хотите. x (x) - это имя члена, а x ( x ) - формальный аргумент.

...