C++ ban mikre lehet használni a const kulcsszót?
Az alapesetet tudom, hogy van egy konstansom, és akkor mondjuk a 3.14 helyett lehet mindig pi-t irni. De mit jelent hogy egy függvényben konstans referencia szerint adunk át pl egy vektort? Azt értem h azért referencia, hogy ne másoljuk le az egész vektort, de mit jelent itt a konstans. Illetve van, hogy csak valami függvény után a paraméterei után már a zárójelen kívül oda van írva a sor végére a const. int fv(int a, int b) const {...}
Ez mit jelent és mikor kell használni? Illetve ezeken kívül milyene esetekben és hogy használandó a const?
Elöre is köszönöm!
Húha. Alapvetően a const a konstans, vagyis állandó jelölése. Ami konstans, annak az értéke nem változtatható meg. Ez a fordító számára is egyfajta optimalizációt tesz lehetővé, ha tudja, hogy egy adott érték nem változik, valamint fejlesztés során is hasznos, ha besípol a kódunk, ha olyasmit akarunk változtatni, amit nem kéne.
Az, hogy a const kulcsszót hova tesszük megváltoztatja a jelentését. Alapvetően a const kulsszó a tőle balra levő kulcsszót helyezi konstans szintre, illetve ha a kifejezés elején van, akkor a jobbra levőt. Így képzeld el:
const int * RandomMethod(int i, double c);
- Konstans int értékre mutató pointert visszaadó metódus. (const a kifejezés elején van, ezért az 'int'-re vonatkozik a konstans, vagyis a visszaadott int értékre. A pointer értékét megváltoztathatod, de a mutatott értéket nem)
int const * RandomMethod(int i, double c);
- Szintén, csak itt már a const a baloldalt teszi konstanssá.
int * const RandomMethid(int i, double c);
- Int típusú értékre mutató konstans pointer (az értéket megváltoztathatod, de a pointert nem)
int * RandomMethod const(int i, double c);
- Ilyen nincs :D
int * RandomMethod(const int i, double c);
-Int pointer visszaadó metódus, aminek az első paramétere konstans int érték.
és végül:
int * RandomMethod(int i, double c) const;
- Na ez egy picit tricky. Ez egy konstans metódus, ami szigorúan véve annyit tesz, hogy a az objektum this* pointere const this* lesz. Ez konyhanyelven azt jelenti, hogy a const metódusok nem módosíthatják az adatszerkezetet. Tehát a metódus konstans abból a szempontból, hogy az objektum a metódus futása során változatlan marad.
Egy apróság kimaradt:
"int * const RandomMethid(int i, double c);
- Int típusú értékre mutató konstans pointer (az értéket megváltoztathatod, de a pointert nem)"
Ennek a szignatúrának nincs értelme. Nem hibás, csak értelmetlen, függvényből ugyanis nincs értelme konstans pointert visszaadni. Ennek az oka az, hogy amikor visszatérsz egy pointerrel, akkor egy másolatot adsz vissza a pointerról, és a visszaadott pointer kizárólag rvalue lehet, azaz jobboldali érték. Ez azt jelenti, hogy értékadásoknak kizárólag a jobboldalán szerepelhet, így a maga módján eleve konstans lesz.
Ugyanúgy nincs sok értelme primitív típust konstansként vissszaadni, ugyanezen okból:
const int RandomMethod();
Ugyanis ezt semmilyen esetben nem tudod megcsinálni:
RandomMethod() = 4;
Viszont ha saját típust hozol létre, ott már lehet értelme constot visszaadni, ugyanis saját típusra megcsinálható a következő:
struct RandomType{}
RandomType RandomMethod() { return RandomType() }
int main()
{
      RandomMethod = RandomType();
}
viszont ha const RandomType a visszatérési érétk, akkor erre már hibát kapsz.
Viszont egyszerű változóként használhatsz konstans pointert:
int randomNumber = 4;
int moreRandomNumber = 3;
int * const SomePointer = &randomNumber;
*SomePointer = 8; //valid
SomePointer = &moreRandomNumber //nem valid, hibát dob.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!