I was looking for a "new CTransaction" somewhere, which doesn't exist since the above is how the tx obj is created from the bytes read into a CNetMessage obj. Guess I have to refamiliarize myself with C++'s serialization operators (it's been almost 20yrs).
new is almost never used in modern C++.
That's not a "C++ serialization operator". In Bitcoin Core, data streams like CDataStream (vRecv there)
overload the >> and << operators to do serialization. The actual serialization is mostly done by code in serialize.h via the ADD_SERIALIZE_METHODS and READWRITE macros used in each class that can be serialized.
So
vRecv >> tx is actually vRecv.operator>>(tx), which ends up callings tx.SerializationOp(vRecv, ...), which applies the READWRITE macro to each serialized CTransaction field (plus maybe some other work), which either directly unserializes the value for simple types, or calls the value's SerializationOp method to do it.
The point of this somewhat complicated setup is that you just need to do
vRecv >> tx to (securely) unserialize a whole transaction, and CTransaction only needs to have a few lines of code to make this happen.