stringtranslate.com

Rebanar objetos

En la programación C++ , la división de objetos ocurre cuando un objeto de un tipo de subclase se copia a un objeto de tipo de superclase: la copia de la superclase no tendrá ninguna de las variables miembro o funciones miembro definidas en la subclase. Estas variables y funciones, en efecto, han sido "cortadas".

Más sutilmente, la división de objetos también puede ocurrir cuando el operador de asignación de la superclase copia un objeto de un tipo de subclase a un objeto del mismo tipo , en cuyo caso algunas de las variables miembro del objeto de destino conservarán sus valores originales en lugar de copiarse. del objeto fuente.

Este problema no es inherentemente exclusivo de C++, pero no ocurre naturalmente en la mayoría de los otros lenguajes orientados a objetos (ni siquiera en los parientes de C++ como D , Java y C# ) porque la copia de objetos no es una operación básica en esos lenguajes.

En cambio, esos lenguajes prefieren manipular objetos a través de referencias implícitas, de modo que solo copiar la referencia sea una operación básica.

En C++, por el contrario, los objetos se copian automáticamente cada vez que una función toma un argumento de objeto por valor o devuelve un objeto por valor.

Además, debido a la falta de recolección de basura en C++, los programas frecuentemente copiarán un objeto siempre que la propiedad y la vida útil de un único objeto compartido no estén claras. Por ejemplo, insertar un objeto en una colección de biblioteca estándar (como std::vector ) normalmente implica hacer e insertar una copia en la colección.

Ejemplo

estructura A { A ( int a ) : a_var ( a ) {} int a_var ; };        estructura B : público A { B ( int a , int b ) : A ( a ), b_var ( b ) {} int b_var ; };              B & getB () { estático B b ( 1 , 2 ); devolver b ; }       int main () { // Asignación normal por valor a A a ( 3 ); // a.a_var == 3 a = getB (); // a.a_var == 1, b.b_var no copiado a a          B b2 ( 3 , 4 ); // b2.a_var == 3, b2.b_var == 4 A & a2 = b2 ; // Asignación parcial por valor mediante referencia a b2 a2 = getB (); // b2.a_var == 1, b2.b_var == 4!             devolver 0 ; } 

Ver también

enlaces externos