Objekt skivning

I C++- programmering sker objektsdelning när ett objekt av en subklasstyp kopieras till ett objekt av superklasstyp: superklasskopian kommer inte att ha någon av medlemsvariablerna eller medlemsfunktionerna definierade i underklassen. Dessa variabler och funktioner har i själva verket "skurits bort".

Mer subtilt kan objektsdelning på samma sätt inträffa när ett objekt av en underklasstyp kopieras till ett objekt av samma typ av superklassens tilldelningsoperator , i vilket fall några av målobjektets medlemsvariabler kommer att behålla sina ursprungliga värden istället för att kopieras över från källobjektet.

Det här problemet är inte i sig unikt för C++, men det förekommer inte naturligt i de flesta andra objektorienterade språk – inte ens i C++s släktingar som D , Java och C # eftersom kopiering av objekt inte är en grundläggande operation i dessa språk.

Istället föredrar dessa språk att manipulera objekt via implicita referenser, så att endast kopiering av referensen är en grundläggande operation.

I C++, däremot, kopieras objekt automatiskt när en funktion tar ett objektsargument efter värde eller returnerar ett objekt efter värde.

Dessutom, på grund av bristen på sophämtning i C++, kommer program ofta att kopiera ett objekt närhelst äganderätten och livslängden för ett enskilt delat objekt skulle vara oklart. Till exempel, att infoga ett objekt i en standardbibliotekssamling (som en std::vector ) innebär faktiskt att man gör och infogar en kopia i samlingen.

Exempel

 

        
     


    

           
     


 

       
     


 

    
     
    
      
    

      
    
       
    
      
    

     0
 struct  A  {  A  (  int  a  )  :  a_var  (  a  )  {}  int  a_var  ;  };  struct  B  :  public  A  {  B  (  int  a  ,  int  b  )  :  A  (  a  ),  b_var  (  b  )  {}  int  b_var  ;  };  B  &  getB  ()  {  statisk  B  b  (  1  ,  2  );  returnera  b  ;  }  int  main  ()  {  // Normal tilldelning efter värde till a  A  a  (  3  );  //a.a_var == 3  a  =  getB  ();  // a.a_var == 1, b.b_var inte kopierad till en  B  b2  (  3  ,  4  );  //b2.a_var == 3 ,b2.b_var == 4  A  &  a2  =  b2  ;  // Partiell tilldelning efter värde genom hänvisning till b2  a2  =  getB  ();  // b2.a_var == 1, b2.b_var == 4!  återvända  ;  } 

Se även

externa länkar