Каково значение ведущих подчеркиваний в конструкторе C ++?
-
22-09-2019 - |
Вопрос
ОК, я не очень опытный программист C ++, но мне было интересно, каково значение недостатков в аргументах следующего конструктора?
class floatCoords
{
public:
floatCoords(float _x, float _y, float _width, float _height)
: x(_x), y(_y), width(_width), height(_height)
{
}
float x, y, width, height;
...
Решение
Это просто удобное соглашение об именах, это ничего не значит для языка. Просто будьте уверены, что вы не следуете за ним с буквой в верхнем случае: Что означает двойное подчеркивание (__const) в C?
Другие советы
Ничего особенного. Он только что назвал это таким, чтобы различать переменные члена и имена параметров.
Подчеркивается действительный символ в идентификаторах C ++.
Скорее всего, автор Кодекса пытался избежать потенциального конфликта между именами членов данных и именами параметров конструктора в списке инициализатора. Скорее всего, автор не знал о том, что правила поиска C ++ убедится, что конфликт в любом случае не произойдет. Т.е. Следующий код также даст ожидаемые результаты
class floatCoords {
public:
floatCoords(float x, float y, float width, float height)
: x(x), y(y), width(width), height(height)
{
}
float x, y, width, height;
...
Хотя это может оказаться запутанным для неподготовленного читателя.
Конечно, внутри тела конструктора имена параметров скрывают имена членов, что делает его необходимыми для использования this->...
или квалифицированные имена для доступа к членам данных. Скорее всего, автор Кодекса также пытался избежать этого.
Это просто соглашение о переменных именованиях, которые предполагают разные люди/учреждения. Это может показаться ненужным с первого взгляда, но на самом деле очень полезно при чтении и написании кода, особенно если у вас есть параметры и переменные -члены, которые имеют одинаковое имя. Например, вы можете иметь эти три случая:
class A {
void foo(int age_) { //parameter
int age = 18; //local scope
if (age_ > age) cout << legal << endl;
}
int _age; //member
};
В приведенном выше примере:
- _Variable - означает, что это переменная члена класса
- variable_ - означает, что это параметр для функции
- Переменная - означает, что это всего лишь обычная переменная, локальная для области функции
Это просто имена для параметров.
Нет особого значения - это просто соглашение, которое может использовать некоторые люди.
У них нет синтаксического значения. Однако, если у вас есть куча полей (например, x
, y
, width
, а также height
), это общее соглашение, чтобы назвать параметры конструктора, которые инициализируют их с помощью имени поля, плюс ведущее подчеркивание.
Целью этих подчеркивается различие переменной параметра float _x
и переменная участника float x
. Анкет Синтаксически, нет особого значения, добавленного из -за недостатков. Я лично предпочитаю префикс все параметры с a_
и префикс все переменные члена с m_
Когда мне придется кодировать C ++.
Поэтому, когда я попадаю в ситуацию, когда мне приходится смешивать и сопоставлять переменные локального, членов и параметров, я знаю, с какими из них я имею дело.
int y = a_x * 2;
m_x = y + 3;
Потому что, если бы вы назвали Den Float X, Float Y и т. Д. Вы не можете получить доступ к фактическим полям класса, потому что у них одинаковое имя.
Это не имеет ничего общего с языком, это просто соглашение фактического программиста (я думаю, что код более очевидным)