вызов функции, имя которой является самим именем класса?

#c

#c

Вопрос:

Я не знаю, какую методологию они используют, поскольку база кода огромна.

Он определил класс следующим образом:

 class ABC {
    member_func(string c);
};

main() {
    ABC("").member_func("this random string");
}
  

Какой недостающий код, который позволил бы нам вызвать ABC(""); ?

Я нигде не видел ни одного объекта этого класса, созданного.

Комментарии:

1. не определена функция или функтор.

2. Это вызов функции или конструктора? Это может быть любой из них.

Ответ №1:

Это просто создает объект типа ABC , но не инициализирует этим объектом какую-либо постоянную ячейку памяти. Т.Е. инициализированный объект ABC , создаваемый вызовом конструктора, является временным и теряется после вызова, поскольку он не создается в ячейке памяти, к которой можно получить доступ после вызова, напримерв качестве автоматической переменной в стеке, в статической ячейке памяти и т. Д. Таким образом, «отсутствующий» код для выполнения такого вызова, который можно использовать в «реальном мире», — это фактическое имя объекта, который сконструирован так, чтобы к нему можно было получить доступ позже… например, что-то вроде ABC my_object(""); или ABC my_object = ABC(""); .

ОБНОВЛЕНИЕ: в обновленном коде, который вы опубликовали, происходит то, что снова создается временный объект типа ABC , а затем нестатический метод вызываемого класса ABC вызывается member_func для временного, который был создан вызовом ABC конструктора. Конечно, чтобы этот код имел какое-либо значение в «реальном мире», этот вызов должен member_func был бы содержать некоторый побочный эффект, который был бы виден за пределами экземпляра класса (т. Е. Экземпляр класса может содержать элемент данных, который является указателем на некоторый объект общей памяти, которыйзатем вызов изменяет). Поскольку, хотя из опубликованного вами примера кода, похоже, не возникает никаких побочных эффектов от вызова, это по сути неоперация … создается временный ABC экземпляр класса, для него вызывается метод, а затем любая ссылка на экземпляр теряется, поскольку он не был создан в ячейке памяти, доступной из текущей области видимости main() .

Комментарии:

1. Фактический вызов — это не ABC(«»); Но его ABC(«»).member_func(); Позвольте мне обновить это в самом вопросе actuall

2. Пройдя по пути Бьярна Страустроупа, я понял, что одной из тонких и ОЧЕНЬ важных концепций C является временность .

Ответ №2:

 class ABC
{
    std::string d;
public:
    ABC(std::string x)         // For the ABC("").
    { d = x; } 

    void foo(std::string x)    // For the foo("").
    { std::cout << d << std::endl << x << std::endl; }
};

int main()
{
    ABC("This creates a temporary object.").foo("This calls foo().");

    // Is the same as...

    {
        ABC obj("This creates another object.");
        obj.foo("This calls obj.foo().");
    } // obj is destroyed.

    return(0);
}
  

Самоочевидно… Я надеюсь. 🙂