En kopi constructor er en speciel medlemsfunktion inde i en klasse. Det accepterer en reference til et eksisterende objekt af samme klasse type og gør en dyb kopi af objektet . En dyb kopi ikke kun kopierer alle medlemslande områder, men også kopierer nogen dynamisk allokeret hukommelse. C + + compilere gør kopi byggeri automatisk. Du er nødt til at definere en kopi constructor når din klasse involverer dynamiske hukommelse. Ting du skal
Intermediate C + + viden
C + + compiler, ligesom Visual Studio 2008
Vis Flere Instruktioner
1
anmeldelse når at kalde en kopi konstruktør. Der er tre situationer: . Når du opretter et objekt fra et eksisterende objekt af samme type , når du passerer et objekt efter værdi til en funktion , og når en funktion returnerer et objekt
2
vide, hvornår din C + + klasse har brug for en kopi konstruktør. Det kan koges ned til dette . Hvis din klasse har pointers og den udfører dynamisk allokering af hukommelse , så skal du give det en eksplicit kopi konstruktør.
3
se på et eksempel , hvor du ikke behøver at definere en konstruktør for en C + + klasse . Klasse X har kun stak variabler og ingen pointere . En flad kopi er tilstrækkelig til at kopiere værdierne i et eksisterende objekt til et nyt objekt . Compileren kan gøre dette automatisk , så du ikke behøver at definere en kopi konstruktør for klasse X : Hej class X {
int num ,
offentlighed : Hej X ( ) : Antal (0) {}
~ X ();
};
4
Study et eksempel, som kræver en aktiv kopi - konstruktør definition. Som man kan se , størrelsen af strengen , N , er ikke en hård -kodet værdi, men bestemmes af brugeren . Sådan opretter B fra A som i udtrykket " ZB (A) , " du er nødt til at fortælle compileren hvor meget hukommelse til at tildele for B. sted at gøre dette er i kopi-constructoren , som følger : Hej class Z {
int N
char * str ;
offentligt : Hej Z ( int n ) : N ( n ) {
str = new char [N] ;
}
Z ( Z & andet) {
str = new char [ other.GetLen ( )],
//kopiere data fra str af "andet" til str af "this "
} < br > ~ Z ( ) {
delete [ ] str ,
}
int GetLen () const {
tilbagevenden N;
}
};
< br >