Gå til innhold

const i funksjons prototype - hjelp


Anbefalte innlegg

Jeg har lurt litt på dette, hva er forskjellen på:

const char *getName( void );

og

const char *getName( void ) const;

 

regner med jeg skjønner forskjellen under når noen får forklart det over:

char *getName( void ) const;

og

const char *getName( void ) const;

Lenke til kommentar
Videoannonse
Annonse
Jeg har lurt litt på dette, hva er forskjellen på:

const char *getName( void );

og

const char *getName( void ) const;

Hvis ikke jeg tar helt feil:

const char* getName(void); returnerer en const char*. Altså en peker til en konstant(ikke lov å endre) streng.

 

const char* getName(void) const; er vel bare brukt i klasser ville jeg tro?

returnerer det samme som over, men lover i tillegg å ikke endre noen av variablene i klassen.

 

 

Er selvfølgelig åpen for korrigeringer!

Lenke til kommentar

Vil legge til at const-objekter av en klasse kan kun kalle const-metoder i klassen:

 

class xstring
{
public:
   const char* c_str() const;
   void assign(const char* str);
};


// ...


const xstring str;

const char* c_str = str.c_str();  // ok
str.assign("sexy string");  // feiler fordi assign() ikke er const

 

Det er også verdt å merke seg at en const-metode ikke garanterer at medlemsvariable blir uforandret. Men det er det semantisk riktige og vil i nesten alle tilfeller stemme. Men noen ganger passer det å bryte retningslinjene, og vi gjør en medlemsvariabel til mutable (mutable er et C++ keyword). Da kan const-metoder forandre medlemsvariable.

 

Eks:

 

class object
{
public:
   object() : _get_count(0)
   {
   }

   const char* get_str() const
   {
       _get_count++;
       return _str.c_str();        
   }
   
private:
   std::string _str;
   mutable size_t _get_count;
}

 

Eksemplet er kun ment som illustrasjon og er ikke et konkret eksempel hvor vi typisk bruker mutable.

Endret av kjetil7
Lenke til kommentar

Ok, når det eneste man vet om en klasse er dens interface, og en av metodene ser slik ut:

virtual bool performingCopyFiles( void ) const = 0;

Hva kan vi da liksom forstå med en gang når const keyword er der på slutten av funksjonen? At variable i den klassen vanligvis ikke vil forandres ved kall på funksjonen? Er det noe annet man kan forstå ut fra det const keyword'et?

 

Høres ikke spesielt nyttig ut å vite at klassen ikke forandrer noen av variablene i klassen.

Endret av Shell
Lenke til kommentar

Først og fremst: I C++, bruk std::string fremfor C-strenger (const char*). Det er lettere, kraftigere og i enkelte tilfeller raskere.

 

Å bruke const i en funksjons signatur, tilsier som sagt at variabler i den klassen (vanligvis) ikke kan endres. Dette gjør at du får en kompilatorfeil dersom du forsøker å endre varibler i den klassen -- noe som hjelper deg å finne feil, f.eks. const kan dessuten fortelle deg om en funksjons bruksområder.

 

For øvrig kan ikke funksjoner som ikke er const brukes i en const klasse. (Edit: Kjetil7 hadde visst allerede forklart dette.) Med andre ord:

 

class Person {
public:
   int get_age() const;
   void set_age(int new_age);
};

const Person p;
p.get_age(); // gyldig
p.set_age(800); // ugyldig

Endret av Myubi
Lenke til kommentar

Nå har jeg bare skummet litt igjennom så mulig at dette allerede er tatt opp, men det const på slutten av en metode-deklarasjon betyr i praksis er at this-objektet er const. Dvs. at hvis du har et const objekt får du bare lov til å kalle const metoder på det, nøkkelordet const er en måte å garantere at du ikke endrer et objekt. Metode-deklarasjonen må etterfølges av const siden this er en implisitt (du trenger ikke å skrive den) parameter i C++.

Lenke til kommentar

Ta f.eks dette stykket kode:

class Blah {
   int x;
public:
   void testConst() const {
       this->x = 2;
   }
};

Her prøver metoden testConst å endre på this, det går ikke siden objektet er erklært const (ved å plassere en const etter metode-deklarasjonen). G++ har dette å si:

tst.cpp: In member function `void Blah::testConst() const':
tst.cpp:5: error: assignment of data-member `Blah::x' in read-only structure

 

Edit: Hvis medlemsvariabelen du endrer er mutable ser kompilatoren bort ifra at objektet er const dog.

Endret av A_N_K
Lenke til kommentar

Jeg syntes ikke at det hadde kommet så klart fram hva const etter en metode-deklarasjon vil si i praksis, og hvorfor syntaksen er slik den er. Hvis this var eksplisitt hadde man sannsynligvis skrevet const foran this-parameteren istedet.

 

Edit: Leif

Endret av A_N_K
Lenke til kommentar

aha, godt svar A_N_K!

 

Jeg er fortsatt litt usikker på meningen med å gjøre en "pure virtual" funksjon const.

 

Tenk deg at jeg har Doom 3 SDK'en, og at det eneste jeg vet om klassen idCommon er det som står i en header fil "Common.h" med den abstrakte klassen (bare pure virtual). Så har jeg en peker til en instans av idCommon. Hvis jeg for eksempel ser denne pure virtual funksjonen i den abstrakte klassen idCommon:

virtual bool performingCopyFiles( void ) const = 0;

Betyr det noe som helst for meg da?

 

Jeg regner med det egentlig ikke er mye vits for meg å vite at den er en konstant funksjon, men viktig å vite for den som implementerer denne funksjonen/abstrakte klassen.

Endret av Shell
Lenke til kommentar
virtual bool performingCopyFiles( void ) const = 0;

Betyr det noe som helst for meg da?

 

Jeg regner med det egentlig ikke er mye vits for meg å vite at den er en konstant funksjon, men viktig å vite for den som implementerer denne funksjonen/abstrakte klassen.

Hvis du skal implementere denne metoden må du samtidig gjøre den const (skal ha samme signatur), når du ser metodedeklarasjonen som bruker vet du at du kan kalle denne metoden på et const objekt. C++-kompilatorer klager kategorisk hvis man kaller en ikke-const metode på et const objekt, siden metoden deklarerer at den tar imot en const type.

Lenke til kommentar

Ok, takk for svar.

 

Forresten, vet vel ikke hvordan jeg kan unngå å få slik warning:

warning C4508: 'WinMain' : function should return a value; 'void' return type assumed

 

Har lest man kan bruke

__attribute__((noreturn));

i gnu c, men __attribute__ funker ikke i windows. Og jeg vil ikke disable warning C4508...

 

edit: jeg vil bruke exit() for å avslutte program...

Endret av Shell
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å
×
×
  • Opprett ny...