Gå til innhold

pass by reference vs pass by address


Anbefalte innlegg

Etter det jeg har forstått så pba og pbr det samme. Det mest synlige forskjellen er at pbr blir "automatisk" dereferenced når du bruker den, i motsetning til en pointer(address) som du må derefence med *ptr.

Har lest noe om at du bruker pba når du er usikker på om objektet eksisterer til enhver tid, for da må man sjekke addressen mot NULL osv.

Leste også noe om at man skulle bruke pba på alle objekter som skal endres, og at dette har røtter i Cs sterke pba røtter.

Da sitter man jo egentlig igjen med at pbr kun skal brukes på const objekter?

 

Spørsmålet gjelder kun c++, da pbr ikke eksisterer i C, bare pba. (Etter det jeg har lest ihvertfall!)

 

Bare lurer på om det er noen som har noen tanker om når man skal bruke hva?

 

(Beklager dersom dette finnes et annet sted på forumet, men har litt dårlig tid :()

Lenke til kommentar
Videoannonse
Annonse

Vanlig praksis er i utgangspunktet å bruke pass-by-reference(-to-const)*, ettersom det vanligvis oppfyller det du er ute etter på en enklest mulig måte. Pass-by-address er mer egnet dersom parameteret må kunne være 0. Bjarne Stroustrup liker for øvrig å bruke pass-by-address dersom parameterne endres i funksjonen, for å indikere nettopp dét:

 

void my_func(int* a, int* b)
{
    *a += 2;
    *b += 2;
}

void f()
{
    int a = 0, b = 2;
    my_func(&a, &b); // &-ene indikerer endring av variablene
}

 

...men det kommer selvfølgelig an på personlig preferanse.

 

 

* Årsaken til at reference-to-const er vanlig, er at implisitt typekonvertering ikke finner sted dersom du bruker reference-to-non-const, ettersom det midlertidige objektet må være const.

 

 

Edit: Svar nummer 6666 i C/C++-forumet :]

Endret av Myubi
Lenke til kommentar

Det er vel ikke snakk om om de endres i funksjonen, men mer en metode for å få flere retur parametre fra en funksjon:


void init_vars (int *i, int *j)
{
   *i = 0;
   *j = 1;
}

int main (void)
{
   int i;
   int j;
   .
   .
   init_vars (&i, &j);  /* & sier at det er adressen til variabelen som sendes */
   .
   .
}

Endret av maskefjes
Lenke til kommentar
Det er vel ikke snakk om om de endres i funksjonen, men mer en metode for å få flere retur parametre fra en funksjon:

 

void init_vars (int *i, int *j)
{
   *i = 0;
   *j = 1;
}

int main (void)
{
   int i;
   int j;

   init_vars (&i, &j);  /* & sier at det er adressen til variabelen som sendes */

}

 

Seksjon 5.5, References, side 99, The C++ Programming Language, Special Edition:

To keep a program readable, it is often best to avoid functions that modify their arguments. Instead, you can return a value from the function explicitly or require a pointer argument

 

Det er riktig å si at det er for å indikere at parameterne endres, for om de ikke ble endret, ville ikke funksjonen gitt informasjon tilbake. Det er galt å si at det er snakk om "returparametre", for funksjoner støtter ett returparameter, og det er indikert av return. Videre er det riktig å si at det er for å markere endring inne i funksjonen, ettersom hele poenget med å bruke pekere er at man skal se at variablene ikke har samme verdi etter funksjonskallet, fremfor plutselig å oppdage at alderen din er økt med tre. Det har med å bruke kompilatoren for å oppdage feil og å bruke språket for å gjøre semantikk eksplisitt osv. å gjøre. Muligheten til å yte informasjon tilbake i flere variabler er irrelevant i denne diskusjonen, fordi det er en diskusjon om referanser kontra pekere, og både pekere og referanser har som kjent den egenskapen.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...