innholdsfortegnelseFAQ for [no.it.programmering.c++]

4.2 Hvordan brukes C++ pekere og referanser i forhold til Java (C#)?

En Java eller C# referanse har tre viktige egenskaper:

  1. Den kan endres på til å referere til et annet objekt, engelsk reseatable.
  2. Det er ikke forskjell på å referere til referansen eller til objektet.
  3. Den har automatisk minneadministrasjon (garbage collection).

C++ som språk støtter i utgangspunktet ikke punkt C, garbage collection.

 

  1. C++ pekere.
    En C++ peker har egenskapen A, resetting, pluss mye annet som f.eks. peker aritmetikk, men ikke B eller C.
            int  a = 42;
            int* p = &a;     // 'p' contains the address of 'a'.
    
            *p = 99;         // 'a' equals 99.
    
    Pekere gir mulighet for nullpekere og ikke gyldige pekerverdier, så direkte bruk av pekere bør unngås i den begrensede grad det er mulig.
     
  2. C++ referanser.
    En C++ referanse har egenskapen B, men ikke A eller C.
            int  a = 42;
            int& b = a;        // 'b' is now another name for 'a'.
    
            b = 99;            // 'a' equals 'b' equals 99.
    
    Referanser brukes mye til parameteroverføring, både for å få enklere notasjon og fordi et korrekt C++ program ikke kan ha nullreferanser.
     
  3. C++ smartpekere.
    En C++ smartpeker har egenskapen C, og typisk også A, men ikke B. En smartpeker er et objekt som inneholder en peker, og som tilbyr de samme operasjonene som er tilgjengelige via pekeren. Smartpekeren tar seg av minne deallokering.
     
    Bruk std::auto_ptr for helt enkel automatisk deallokering, basert på overføring av eierskap til objektet.
            #include <memory>   // std::auto_ptr
    
            struct S { /* ... */ };
    
            void f()
            {
                std::auto_ptr<s>  pObject( new S() );
    
                // ...
                // Automatic deallocation of pObject when f() returns.
            }
    
    Bruk f.eks. boost::shared_ptr (se [http://www.boost.org]) for mer generell referansetellingsbasert deallokering, men obs: referansetelling støtter ikke deallokering av sirkulære datastrukturer.