Инициализатор членов класса: синтаксис и использование - PullRequest
2 голосов
/ 24 марта 2020

Скажем, есть класс:

class person {
    int age;
    string name;

    public:
       person(int age,string name)
            :age(age),name(name)
                {}
};

У меня есть следующие вопросы:

  • Можно ли каким-либо образом использовать инициализатор конструктора (с синтаксисом ":") вне классы? Это только для классов?
  • Объявление переменной, такое как int x(2), работает по очевидным причинам. x - это объект со значением 2. Но age (age), как это работает? Синтаксис сделал так, чтобы упростить инициализацию?
  • Исходя из этого, почему параметр age & member age может иметь одно и то же имя и не вводить компилятор в заблуждение? age находится в области действия (как закрытый член), но параметр age также находится в области действия. Когда это происходит с обычными функциями, преобладает localest.

Спасибо!

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Можно ли каким-либо образом использовать инициализатор конструктора (с синтаксисом ":" вне классов? Это только для классов?

Списки инициализатора элементов могут использоваться только конструкторами .

Объявление переменных, например int x(2), работает по очевидным причинам. X - это объект со значением 2. Но age(age), как это работает? Сделан ли синтаксис таким образом, чтобы упростить инициализацию?

Исходя из этого, почему параметр age & member age может иметь одинаковое имя и не вводить компилятор в заблуждение? Элемент age находится в области видимости, но параметр age также находится в области видимости. Когда это происходит с обычными функциями, преобладает «localest».

у нас есть и ожидаем member(init), поэтому для member видны только члены класса (и Base класс или собственный класс для делегирования конструктора). Можно сказать, что мы находимся только в области действия класса.

Для init действительно применяется обычная область действия, а параметры age / name скрывают элементы с одинаковыми именами.

1 голос
/ 24 марта 2020

Это не «запутывает» компилятор. Так как это список инициализатора члена, его область действия такая же, как и у конструктора. Поэтому область действия выигрывает над областью класса. И, следовательно, элемент age инициализируется параметром age.


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

struct Decision {
  bool launch_nukes;
  Decision(bool /*launch_nukes*/)  : launch_nukes(launch_nukes) {
  }
};

В лучшем случае выдаст только предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...