Shell Skrevet 19. mai 2005 Del Skrevet 19. mai 2005 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
Peter Skrevet 19. mai 2005 Del Skrevet 19. mai 2005 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
kjetil7 Skrevet 19. mai 2005 Del Skrevet 19. mai 2005 (endret) 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 19. mai 2005 av kjetil7 Lenke til kommentar
Shell Skrevet 20. mai 2005 Forfatter Del Skrevet 20. mai 2005 (endret) 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 20. mai 2005 av Shell Lenke til kommentar
☀ ❄ Skrevet 20. mai 2005 Del Skrevet 20. mai 2005 (endret) 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 20. mai 2005 av Myubi Lenke til kommentar
A_N_K Skrevet 20. mai 2005 Del Skrevet 20. mai 2005 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
A_N_K Skrevet 20. mai 2005 Del Skrevet 20. mai 2005 (endret) 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 20. mai 2005 av A_N_K Lenke til kommentar
☀ ❄ Skrevet 20. mai 2005 Del Skrevet 20. mai 2005 Nå har jeg bare skummet litt igjennom så mulig at dette allerede er tatt opp, [...] Jepp, du er den tredje så langt Lenke til kommentar
A_N_K Skrevet 20. mai 2005 Del Skrevet 20. mai 2005 (endret) 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 20. mai 2005 av A_N_K Lenke til kommentar
Shell Skrevet 20. mai 2005 Forfatter Del Skrevet 20. mai 2005 (endret) 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 20. mai 2005 av Shell Lenke til kommentar
A_N_K Skrevet 20. mai 2005 Del Skrevet 20. mai 2005 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
Shell Skrevet 20. mai 2005 Forfatter Del Skrevet 20. mai 2005 (endret) 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 20. mai 2005 av Shell Lenke til kommentar
A_N_K Skrevet 20. mai 2005 Del Skrevet 20. mai 2005 Husker minimalt av Win32, men skal ikke WinMain ha en returverdi, noe à la int WINAPI WinMain? Lenke til kommentar
Shell Skrevet 20. mai 2005 Forfatter Del Skrevet 20. mai 2005 ja, glem det jeg sa, dumt spørsmål. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå