Hvordan bruke Copy Constructors i C ++

En kopi konstruktør er en spesiell medlem funksjon inne i en klasse. Det aksepterer en referanse til et eksisterende objekt av samme klasse type og gjør en dyp kopi av dette objektet. En dyp kopi ikke bare kopierer alle medlems felt, men også kopier noe dynamisk allokert minne. C ++ kompilatorer kopierer konstruksjon automatisk. Du må definere en kopi konstruktør når klassen innebærer dynamisk minne.

Bruksanvisning

1 Gjennomgå når du skal ringe en kopi konstruktør. Det er tre situasjoner: ved opprettelse av et objekt fra en eksisterende gjenstand av samme type, når man passerer en gjenstand ved verdi til en funksjon og når en funksjon returnerer et objekt.

2 Vit når din C ++ klasse trenger en kopi konstruktør. Det koker ned til dette. Hvis klassen har pekere og den utfører dynamisk minnetildeling, må du gi den en eksplisitt kopi konstruktør.

3 Se på et eksempel der du ikke trenger å definere en konstruktør for en C ++ klasse. Klasse X har bare stable variabler og ingen pekere. En grunne kopi er tilstrekkelig til å kopiere verdiene av et eksisterende objekt til et nytt objekt. Kompilatoren kan gjøre dette automatisk, slik at du ikke trenger å definere en kopi konstruktør for klasse X:

klasse X {

int num;

offentlig:

X (): num (0) {}

~ X ();

};

4 Studere et eksempel som krever en eksplisitt kopi-konstruktør definisjon. Som du kan se, størrelsen på strengen, N, er ikke en hardkodet verdi, men bestemmes av brukeren. Slik oppretter B fra A som i uttrykket "ZB (A)," du har å fortelle kompilatoren hvor mye minne til å tildele for B. I stedet for å gjøre dette på er i kopien konstruktør, som følger:

klasse Z {

int N;

char * str;

offentlig:

Z (int n): N (n) {

str = new char [N];

}

Z (Z & andre) {

str = new char [other.GetLen ()];

// Kopiere data fra den str av "andre" til str på "dette"

}

~ Z () {

slette [] str;

}

int GetLen () const {

returnere N;

}

};

Hint

  • Tenk deg at du utelater kopi konstruktør i Z. Når du gjør ZB (A), vil kompilatoren gjøre en grunne kopi. Dette betyr, str av B vil nå ha adressen verdien av str av A, som peker til strengen "Hello \ 0" et eller annet sted i haugen. Hvis A blir slettet, vil str av B peker til ingensteds. Hvis du prøver å skrive ut str av B, får du en tilgangsbrudd. Så sørg for at du gjør eksplisitte kopi konstruktører der du må.