Как можно вообще ничего не объявлять внутри main() в С++ и все же иметь рабочее приложение после компиляции?
В интервью я столкнулся с таким вопросом, как:
Ваш друг предоставил вам один файл исходного кода, который печатает Числа Фибоначчи на консоли. Обратите внимание, что основной() блок пустой и не имеет никаких утверждений внутри него.
Объясните, как это возможно (подсказка: глобальный экземпляр!)
Я действительно хочу знать об этом, как такая вещь может быть даже возможна!
Ответы
Ответ 1
Скорее всего, он реализован как (или его вариант):
void print_fibs()
{
//implementation
}
int ignore = (print_fibs(), 0);
int main() {}
В этом коде глобальная переменная ignore
должна быть инициализирована перед входом в функцию main()
. Теперь, чтобы инициализировать глобальный, нужно выполнить print_fibs()
, где вы можете что-то сделать -— в этом случае, вычислить числа фибоначчи и распечатать их! Аналогичная вещь, которую я показал в следующем вопросе (который я давно просил):
Обратите внимание, что такой код небезопасен и его следует избегать в целом. Например, объект std::cout
не может быть инициализирован при выполнении print_fibs()
, если да, то что бы сделать std::cout
в функции? Однако, если в других обстоятельствах он не зависит от такого порядка инициализации, тогда можно безопасно вызвать функции инициализации (что является обычной практикой в C и С++).
Ответ 2
Надеюсь, что это поможет
class cls
{
public:
cls()
{
// Your code for fibonacci series
}
} objCls;
int main()
{
}
Итак, как только объявляется глобальная переменная класса, вызывается конструктор, и вы добавляете логику для печати серии Fibonacci.
Ответ 3
Да, это возможно.
Вам нужно объявить глобальный экземпляр объекта, который вычисляет числа Фибоначчи в конструкторе объекта.
Ответ 4
Я знаю несколько примеров, которые вы рассказываете. Один из способов получить это - использовать метапрограммирование шаблона. Используя его, вы можете переместить некоторый процесс вычисления в компиляцию.
Здесь вы можете получить пример с номерами Фибоначчи
Если вы используете его в статическом конструкторе классов, и вы можете писать числа без необходимости писать какой-либо код в основной функции.
Надеюсь, это поможет вам.
Ответ 5
Вещи могут произойти при инициализации глобальных/статических переменных. Код запускается при запуске приложения.
Ответ 6
Все конструкторы [*] для объектов области видимости объекта вызываются до достижения main
, как и все выражения инициализатора для переменных объекта без объекта.
Изменить: Кроме того, все деструкторы [*] для всех объектов области видимости объекта вызывают в обратном порядке построения после выхода main
. Теоретически вы могли бы поместить свою программу фибоначчи в деструктор объекта.
[*] Обратите внимание, что "все" игнорирует поведение динамически загружаемых и выгружаемых библиотек, с которыми ваша программа напрямую не связана. Тем не менее технически они находятся за пределами базового языка С++.