Tildelingsoperation i C++

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 4. juni 2017; checks kræver 5 redigeringer .

Tildelingsoperatøren i programmeringssproget C++ er angivet med tegnet '='. Ligesom andre operatører i C++ kan den overbelastes med .

Kopieringstildelingsoperationen er en speciel slags tildelingsoperation, der bruges til at tildele objekter af samme klasse til hinanden. Det er et af de særlige funktionsmedlemmer og genereres automatisk af compileren , hvis der ikke er nogen eksplicit erklæring fra programmøren. Koden genereret af compileren kopierer bitvis.

Kopitildelingsoperatøren adskiller sig fra kopikonstruktøren ved, at den skal rydde op i datamedlemmerne for opgavens mål (og håndtere selvtildelingen korrekt), mens kopikonstruktøren tildeler værdier til ikke-initialiserede datamedlemmer. [1] For eksempel:

My_Array først ; // initialisering med standardkonstruktør My_Array second = first ; // initialisering med kopikonstruktør second = first ; // opgave ved kopi tildeling operation

Som et særligt tilfælde skal følgende variant af initialisering af kopikonstruktøren bemærkes:

My_Array second = My_Array ();

I dette tilfælde udfører compileren (f.eks. VC2013) med det samme, uden nogen optimeringsmuligheder, returværdioptimering (RVO, returværdioptimering), og kopikonstruktøren kaldes ikke.

Kopier opgave overbelastning

Når det kommer til at lave dybe kopier af objekter, skal undtagelseshåndtering også tages i betragtning . En måde at undgå ressourceflytningsfejlen på er som følger:

  1. Få nye ressourcer
  2. Frigør gamle ressourcer
  3. At tildele objektet værdierne for den nye ressource
klasse My_Array { int * array ; int antal ; offentligt : My_Array & operator = ( const My_Array og andet ) { if ( this != & other ) // beskyttelse mod ukorrekt selvtildeling { // 1: alloker "ny" hukommelse og kopiér elementer int * new_array = new int [ other . tælle ]; std :: kopi ( andet . array , andet . array + andet . count , new_array ); // 2: frigør "gammel" hukommelse slet [] array ; // 3: tildel værdier i "ny" hukommelse til objektarrayet = new_array ; tælle = andet . tælle ; } // returnerer efter konvention altid *this return * this ; } ... };

Men hvis en vellykket udvekslingsmetode er tilgængelig for alle medlemmer, og klassen implementerer en kopikonstruktør og en destruktor (i henhold til regelen om tre ), vil den korteste måde at implementere en kopiopgave på være [2] :

offentligt : void swap ( My_Array & other ) // swap member funktion (bør ikke mislykkes!) { // swap alle medlemmer (og underliggende sub-objekter, hvis det er muligt) med andre std :: swap ( array , other . array ); std :: swap ( tælle , andet . tælle ); } My_Array & operator = ( My_Array other ) // Bemærk: argumentet sendes af værdi! { // swap dette med andet swap ( andet ); // returnerer efter konvention altid *this return * this ; // andet er ødelagt, frigør hukommelse }

Grunden til at operationen =vender tilbage My_Array&i stedet for voider enkel. Det er tilladt at kombinere opgaver som:

matrix_1 = matrix_2 = matrix_3 ; // værdien af ​​array_3 er tildelt til array_2 // derefter tildeles værdien af ​​array_2 til array_1

Se også

Links

  1. Bjarne Stroustrup . C++ programmeringssproget  (neopr.) . - 3. - Addison-Wesley , 2000. - S. 244. - ISBN 978-0201700732 .
  2. Sutter, H. & Alexandrescu, A. (oktober 2004), C++ Coding Standards , Addison-Wesley , ISBN 0-321-11358-6