Come hai chiesto in generale alle lingue OOP: dipende da quale lingua.
Innanzitutto, non tutti i linguaggi orientati agli oggetti supportano una nozione formalizzata di proprietà. C # e VB fanno, ma Java no, né C ++, per esempio (gli altri consentono invece getter e setter manualmente / individualmente definiti che non sono necessariamente riconosciuti dalla lingua come coppie della stessa proprietà).
C ++ d'altra parte consente la vera incorporazione di un'istanza di una classe all'interno di un'istanza di un'altra. Consente inoltre a una variabile locale di essere una vera istanza di una classe.
Tuttavia, Java, C # e VB usano tutti i riferimenti alle istanze di oggetti (nell'heap). Quindi, Java, C # e VB non consentono vere istanze di classi come variabili o campi. Tuttavia, questi linguaggi implicitamente la dereferenziano i riferimenti quando li usi in modo naturale.
(In questi linguaggi, i riferimenti, FYI, sono passati per valore: il chiamante può modificare l'oggetto e verrà visto dal destinatario, poiché i riferimenti (copie) puntano alla stessa istanza dell'oggetto heap, tuttavia, se il chiamante modifica il riferimento stesso, che non sarà visto dal callee.)
In Java, C # e VB, puoi quindi inserire un riferimento a un oggetto come campo di una classe. In C # e VB, puoi inserire un riferimento a un oggetto come proprietà di una classe (con un campo di supporto facoltativo o solo come getter e / o setter).
In C ++ puoi passare un'istanza di una classe in base al valore o assegnare una classe a un'altra (dello stesso tipo). C ++ ha anche entrambi riferimenti e puntatori e devi essere esplicito sull'uso di ognuno di essi rispetto a ottenere una vera istanza di classe.