Как перегрузка operator () не переопределяет конструктор класса - PullRequest
0 голосов
/ 01 апреля 2020

Имея следующий класс с функцией operator()(string) и конструктором X(string):

class X
{
public:
    string n;

    X(string s) : n(s) {}

    void operator() (string s)
    {
        cout << "func";
    }
};

Почему X x("a"),y("b"); не вызывает ошибок? Как компилятор знает, какую функцию выбрать?

1 Ответ

0 голосов
/ 03 апреля 2020
X x("a"),y("b");

Эквивалентно

X x("a");
X y("b");

Поэтому я сосредоточусь на

X x("a");

Это объявление и инициализация переменной x. Учитываются только конструкторы и преобразования (*).

operator() - оператор вызова функции. Он используется для вызова объекта, как если бы это была функция. Так что он используется на существующем объекте. Например:

X x("asd"); // <-- constructor call
x("yolo"); // <-- operator() call

В качестве примечания я рекомендую использовать синтаксис скобки init {} для инициализации объектов:

X x{"asd"};
auto x = X{"asd"};

*) As бонус , вот пример используемого пользователем оператора преобразования:

struct X { };

struct Y
{
    operator X() const { return X{}; }
};

auto test()
{
    Y y;

    X x(y);
    // the above line is equivalent with:
    X x = static_cast<X>(y.operator X());
}

Я использовал X x(y) для имитации c вашего примера, но опять же, я рекомендую:

auto test()
{
    Y y{};
    X x{y};
}

вместо

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