Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pojasnjenje const povratnih vrijednosti i parametara

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pojasnjenje const povratnih vrijednosti i parametara

[ Pregleda: 2166 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

virtualVoid

Član broj: 161084
Poruke: 698



+28 Profil

icon Pojasnjenje const povratnih vrijednosti i parametara30.12.2007. u 16:34 - pre 149 meseci
U osnovi, nisam mislio da ce mi const vrijednosti praviti konfuzije dok nisam naisao na ovu klasu

Code:
class KucniLjubimac{  
protected:  
  char ime[20]; 
  int starost;  
public:  
  KucniLjubimac(char *ime, int starost); //konstruktor 
   
  const char * GetIme() const;  
  void SetIme(const char * ime);  
   
  int GetStarost() const;  
  void SetStarost(int starost);  
}; 


Konfuzije mi prave:

1. funkcija getIme - zasto ona vraca const char*? Nije mi jasno da li je ovo const zato jer imamo staticki niz ime (char ime[20]) ili je const upravo jer se radi o getter funkciji koja samo vraca nesto? Da li bi bi ovaj getter mogao vratiti const char* da imamo dinamicki niz 'const* ime'? (onaj drugi const mi je potpuno jasan i tu ne treba pojasnjenje)

2. void setIme - kako ona prima const parametar kad je to parametar koji jos ne postoji? ovaj gornji const bih i mogao provariti da nije ovoga. kako moze nesto biti const, kad ono jos ne postoji. nije to isto kao da joj prosljedjujemo neki staticki niz za koji sigurno znamo da je const (znamo mu velicinu).

3. funkcija getIme - zasto sada ovdje ne stoji const int kao povratna vrijednost?

4. void setStarost - zasto ovdje parametar nije const int?

5. Na kraju, i konstruktor je izvjesna setter funkcija pa zasto onda i njegovi parametri nisu const? istina nisam nikada vidio da konstruktor ima const parametre, ali...

To bi bilo sve.
...
 
Odgovor na temu

virtualVoid

Član broj: 161084
Poruke: 698



+28 Profil

icon Re: Pojasnjenje const povratnih vrijednosti i parametara31.12.2007. u 09:25 - pre 149 meseci
http://www.parashift.com/c++-faq-lite/const-correctness.html

Jedan dokument u kojem se objasnjava zasto koristiti const "obecanja". Nazalost, ne pomaze previse u slucaju gornjih nedoumica.
...
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
89.216.197.*



+1 Profil

icon Re: Pojasnjenje const povratnih vrijednosti i parametara31.12.2007. u 09:45 - pre 149 meseci
1) Povratna vrednost tipa const char* znači da se vraća pokazivač koji pokazuje na konstantnu vrednost, dakle ne može se menjati sadržaj onoga na šta pokazuje. Kada bi vraćala samo char* onda bi se prihvaćena povratna vrednost mogla promeniti što verovatno autor klase ne želi. Nema veze sa tim što je ime statički definisan niz.
2) Prihvata const char* jer metoda ne menja sadržaj koji jos se prosleđuje. Ako ne bi bilo const onda bi metoda mogla da promeni sadržaj na koji parametar pokazuje.
3) Povratna vrednost je kopija vrednosti koja se vraća sa return. Kako je to kopija koja se vraća, onaj koji tu vrednost prihvati može slobodno da je menja bez opasnosti po objekat sa tom metodom. Princip je isti i kada je povratna vrednost char*, vraća se kopija pokazivača u return izrazu. Međutim, kada se vraća kopija pokazivača, onda on i dalje pokazuje na isti objekat kao i "original". Koristeći tu kopiju može se promeniti vrednost objekta na koji pokazuje! Zato u 2) postoji jos i const kako bi bila onemogućena promena vrednosti preko kopije pokazivača.
4) Povratna vrednost metode kao i prihvatanje parametara u metodi barata zapravo sa kopijama prosleđenih parametara. Kada se prosleđuju kopije "običnih" tipova poput int, float, string, onda je nebitno da li se te vrednosti menjaju u metodi jer se sve promene dešavaju na kopijama prosleđenih parametara. Međutim, kada se proslede tipovi poput int*, char*, opet se prosleđuju kopije parametara tj. pokazivača, ali onda je moguće izmeniti sadržaj onoga na šta oni pokazuju, što često nije poželjno ponašanje.
5) Konstruktor može bez problema kao i svaka druga metoda da prihvata const parametre. const ima smisla za pokazivače ili reference jer je tada moguće promeniti vrednost onoga na šta pokazuju. Ako se prosleđuje npr. int parametar, onda metoda barata njegovom kopijom pa i nije bitno da li je konstantan.

Dakle, parametri metoda i vrednost koju vrati return su uvek kopije prosleđenih parametara. To važi i za pokazivač, ali je problem sa njim što se vrednost na koju pokazuje može promeniti i preko kopije pokazivača. Zato se uvode const parametri kako bi se tako nešto sprečilo.

[Ovu poruku je menjao karas dana 31.12.2007. u 10:58 GMT+1]
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

virtualVoid

Član broj: 161084
Poruke: 698



+28 Profil

icon Re: Pojasnjenje const povratnih vrijednosti i parametara31.12.2007. u 17:48 - pre 149 meseci
Hvala mnogo karas. Do sada uopce nisam o return-u razmisljao na nacin kako si ga opisao, a sada mi je sasvim logicno zasto se koristi const uz pokazivace. Evo slijedom toga sam i pokusao napraviti jedan primjer ovoga. Jesam li dobro uradio primjer u kome ja namjerno prosljedjujem pogresnu vrijednost od unesene? Jesi li na ovo mislio kada si govorio o sprecavanju promjene originalne vrijednosti?

Code:
void SetIme(const char* ime){
        strcpy(ime,"bezze neko");//<-- ovdje bi kompajler trebao izbaciti gresku
        strcpy(this->ime, ime);
    } 

...
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
89.216.197.*



+1 Profil

icon Re: Pojasnjenje const povratnih vrijednosti i parametara01.01.2008. u 20:51 - pre 149 meseci
Da, kompajler treba da izbaci grešku poput invalid conversion from const char* to char*.
const u deklaraciji parametara pokazuje onome koji koristi funkciju da ona ne menja vrednost prosleđenog parametra, tako da je poželjno koristiti tu konstrukciju jezika.
Obrati još pažnju na slučaj (ako se nisi susretao)
Code:

char* const ime;

Ovo znači da je pokazivač ime konstantan ali ne i vrednost na koju pokazuje; dakle može se promeniti sadržaj na koji pokazuje. Ovo baš nema svrhe kod parametara u funkcijama jer se i onako prosleđuju kopije, ali nije loše znati čisto da bi se upotpunila slika o pokazivačima.
Naravno, moguća je i kombinacija
Code:

const char* const ime;

kada su i pokazivač i vrednost na koju pokazuje konstantni.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pojasnjenje const povratnih vrijednosti i parametara

[ Pregleda: 2166 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.