@JustMoose
Программист. Радиолюбитель. Прокрастинатор ;)

Почему имя параметра может совпадать с именем члена класса?

Всем привет!
Часто вижу код следующего вида:
struct MyStruct {
  MyStruct(QString name, Qt::SortOrder order)
    : name(std::move(name)), order(order) {}

  QString name;
}


И в этом коде имя параметра (name) совпадает с именем поля (name).
Вопрос: как это вообще работает? Как плюсы понимают, что с одной стороны параметр, а с другой - член класса?
Что-то я так и не смог вспомнить, какой хотя бы раздел учебника по плюсам мне стоит освежить :(
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 2
AshBlade
@AshBlade
Просто хочу быть счастливым
Как плюсы понимают, что с одной стороны параметр, а с другой - член класса?

Это называется семантический разбор. На вход компилятору подается исходный текст, на выходе - дерево выражений (очень грубо говоря).
Существуют правила, по которым эти деревья строятся. Например, БНФ.
Вот в них и описывается что и где может находиться. В данном случае, в списке инициализации могут находиться только члены класса, но ты передаешь еще и параметры. В этот момент компилятор сходит с ума, т.к. нарушаются эти правила .
P.S. чтобы подобных проблем не было, то для полей классов используй префикс подчеркивания
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Это НЕ синтаксический разбор, а семантика языка.
В большинстве случаев играет роль ближайший идентификатор. Но в инициализаторах снаружи скобок поле объекта (больше ничего там быть не может, только поле)

#include <iostream>

class Obj {
public:
    Obj(std::string x)
        : x(std::move(x))
        // 1. Поле, больше ничего быть не может
        // 2. Параметр, как ближайший идентификатор
    {
        std::cout << '[' << x << ']' << '\n';  // Параметр, как ближайший идентификатор
    }
private:
    std::string x;
};

int main()
{
    Obj obj("Habr");
    return 0;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы