Jag har i flera exempel sett att det står "const" efter ett funktionsnamn i C++. Vad betyder det? Det står bara efter medlemsfunktioner, inte vanliga. Det innebär att funktionen garanterat går att köra på ett objekt, även om objektet är konstant. "const" efter en medlemsfunktionsdeklaration betyder att funktionen inte påverkar objektet på något sätt. Det exemplet kanske var lite dumt. Skulle snarare angett det här: Tack för svaren... Nja... nästan rätt. Hej! <b> >-->Niklas: "Ett objekt ändrar inte sitt tillstånd" Hej! >Du skrev: "kan man göra så att vissa medlemsvariabler får ändras trots att objektet >är konstant". Håller med om mutable (ovanligt alltså), har själv bara läst om det. Tack för svaret och den efterföljande diskussionen. Sätter tråden som löst, men fortsätt gärna diskussionen...Vad betyder "const" efter ett funktionsnamn?
Exempel :
<code>
class MazeFactory {
public:
virtual Maze* MakeMaze() const { return new Maze; }
};
</code>Sv: Vad betyder "const" efter ett funktionsnamn?
Kan förklara lite närmare senare, har lite bråttom nu...Sv: Vad betyder "const" efter ett funktionsnamn?
Detta används av kompilatorn för att avgöra om man kan anropa medlemsfunktionen på ett "const" objekt.
exempel
class myClass {
int x;
public:
myClass();
int getConstX() const;
int getX();
}
main() {
const myClass x;
x.getConstX(); // ok
x.getX(); // error
}Sv: Vad betyder "const" efter ett funktionsnamn?
class myClass {
int x;
public:
myClass(int X) : x(X) {}
int getX() const
{ return x;}
void setX(int X)
{ x=X;}
}
//...
{
const myClass m = myClass(2);
myClass k = myClass(2);
k.setX(3);
k.getX();
m.getX();
m.setX(3); //FEL!
}Sv: Vad betyder "const" efter ett funktionsnamn?
Tolkar jag det rätt då att ett objekt deklarerat som "const" bara får ändra sitt tillstånd i konstruktorn?
Och att ett objekt som INTE är deklarerat som "const" kan ändra sitt tillstånd antingen i konstruktorn eller med hjälp av de funktioner som EJ är deklarerade som "const"?
/PerSv: Vad betyder "const" efter ett funktionsnamn?
Ett objekt ändrar inte sitt tillstånd, det sätter sitt initiala tillstånd. Innan konstruktorn är klar har objektet inget tillstånd.
Sen så behöver inte ett objekt vara explicit deklarerat som const för att det skall betraktas som konstant, det finns många andra tillfällen.
Och för att krångla till det ytterligare kan man göra så att vissa medlemsvariabler får ändras trots att objektet är konstant, med keywordet mutable...Sv: Vad betyder "const" efter ett funktionsnamn?
Ännu ett inlägg i debatten!
-->Niklas: "Ett objekt ändrar inte sitt tillstånd"
Jo det gör det om det inte är deklarerat som "const".
Ett objekts tillstånd är "summan" av dess medlemsvariabler och relationer, i ett givet ögonblick.
-->Niklas: "Och för att krångla till det ytterligare kan man göra så att vissa medlemsvariabler,
får ändras trots att objektet är konstant, med keywordet mutable..."
Nja, det är väl så att funktioner som är deklarerade som "const" får ändra på variabler som är deklarerade med "mutable".
/HåkanSv: Vad betyder "const" efter ett funktionsnamn?
>Jo det gör det om det inte är deklarerat som "const". </b>
Det är lite av ett felcitat. Du har bara tagit med första delen av meningen.
Ett objekt ändrar inte sitt tillstånd _i konstruktorn_. Den får sitt tillstånd, från att tidigare aldrig ha haft något. I medlemsfunktioner ändras tillståndet. Kan hålla med om att det var aningen otydligt, men "sätter sitt initiala tillstånd" har väl svårt att betyda något annat?
<b>
>Nja, det är väl så att funktioner som är deklarerade som "const" får ändra på variabler som är deklarerade med "mutable". </b>
De behöver som sagt inte deklareras som const för att betraktas som konstanta - viktigt att poängtera det.
Och du har nog bara missförstått det jag skrev, kanske lite dåligt formulerat. Jag menar naturligtvis inte att funktionerna ska deklareras med mutable, utan variablerna.Sv: Vad betyder "const" efter ett funktionsnamn?
Det var just första delen av citatet jag ville åt, eftersom den kan tydas som att ett objekt aldrig ändrar tillstånd, utan att det bara får ett vid "konstruktionen".
Endast ett förtydligande från min sida, så att ingen missförstår......
Självklart är det variablerna som deklareras som "mutable" det har vi båda skrivit.
Du skrev: "kan man göra så att vissa medlemsvariabler får ändras trots att objektet är konstant".
Det var detta (taget ur sitt sammanhang) som jag svarade på då jag skrev att "mutable"används på de variabler som får/kan ändras av funktioner som är deklarerade som "const".
De kan ju normalt inte ändra någonting (som vi nu vid det här laget vet).
Det är det här som jag anser är funktionen för "mutable".
Kanske är det en kombination av det du skrev, och det jag skriver. :-)
Vad anser du?
Alltid lär man sig något nytt.
/HåkanSv: Vad betyder "const" efter ett funktionsnamn?
Ja... då får man ju definiera vad ett "objekt som är konstant" betyder. Jag anser att det är när ett objekt inte förändrar sitt beteende eller sina egenskaper, när det alltid har samma tillstånd. Det är det man vill uppnå när man deklarerar ett objekt som "const", eller när man t.ex. skickar det till en funktion som tar konstanta objekt.
Ok.
>"mutable"används på de variabler som får/kan ändras av funktioner som är deklarerade som "const".
Och det jag menar är att mutable betyder att den variabeln inte är del av ett ojekts egenskaper på något sätt. Är det så, så skall den kunna förändras oavsett om objektet är konstant eller inte.
Personligen ser jag det helst inte i termer av att "det står const framför funktionsnamnet", utan snarare i hur jag ser på objekten och deras funktion. Därför kallar jag objekten konstanta, även om de har variabler som går att ändra.
(och det finns ju dessutom än mer besvär, när vissa saker går att ändra - trots att de inte är mutable...)
Grejen är bara att mutable är så ovanligt att man i regel inte ens behöver tänka på det...Sv: Vad betyder "const" efter ett funktionsnamn?
>>"Ja... då får man ju definiera vad ett "objekt som är konstant" betyder. Jag anser att det är när ett objekt inte förändrar sitt beteende eller sina egenskaper, när det alltid har samma tillstånd. Det är det man vill uppnå när man deklarerar ett objekt som "const", eller när man t.ex. skickar det till en funktion som tar konstanta objekt."
Håller med om ovanstående.
>>"Därför kallar jag objekten konstanta, även om de har variabler som går att ändra."
Antar att i det här fallet syftar du på en annan typ av konstanthet.
/HåkanSv: Vad betyder "const" efter ett funktionsnamn?