This question came up as I was working on an object, and I was thinking that just like the local data, the outlet_foo variables were retained unless changed, with confusing results - I would set the outlet to a value when a specific set of conditions occurred, but not otherwise. It was being set alright but next krate period it had changed even though my code didn't touch it.
Looking at the generated xpatch.cpp, all signals between objects take place using variables called net, e.g. net45. The net variables are declared as ordinary stack variables
For patches where the first object to use a net uses it as an output, this works fine, if not, additional instance variables (i.e. static) called netLatch are used. In this case, at the end of the dsp() method, net45Latch would be set to the value of net45, so that an object that needed it as an input in the next iteration would use net45Latch instead of net45 which would not have been initialized yet. The patcher code obviously keeps track of the order of the objects relative to the nets in order to use the appropriate variable.
I'm feeling I'm missing something obvious here, because couldn't all net variables be static so that they retained their value across dsp() calls? That way it would not be necessary to have the Latch variables at all. After all, it seems the current implementation mimics this behavior in a convoluted way.