You can think about different solutions. In the loop, no matter the chosen solution, some extra code will be always executed (at best behind the scenes) to prevent the functions to be executed. You could skip in the loop the execution of funX, but it would be extra code to check if funX can be executed, placed differently.
Since commonly initialization is done before other task, this is a strange problem, or a misnaming (you should not call it initialization).
If you want, the functions can call the initializer by themselves, like
if (!initialized) initialize();
Always extra code, and the !initialized will be always false from then on.
But the way to avoid to check again and again is to call explicitly the initialization in the correct place, before the game begins to play for real. (Otherwise don't call it initialization).
If it were an object, ... you don't need object for this. To "trig" a constructor, you must create the object (at least, in many OO languages) with, say, new MyClass()
or "declaring it"; here the call to "new" (that is not a call, but for this speech we can think this way) or the "declaration" is changed into a call to an explicit initializer. Your apparently simple
Object a;
// ...
a.method(); //or
Object *a = new Object();
// ...
a->method();
would be
init()
// ...
funA();
Even if this example does not "match" your "need", it should make clear that an explicit initializer is not so tremendously bad and OO languages really are not necessary to "fix" this problem.
You can control when you can call those funcs, so you don't need checking at all; it happens in many libraries that require first a call to special init function before you can use them, or "odd" behaviours must be expected.