Citat:
Pretender:
Mr. Jesse pocinje da koristi operator : , bez neke nelagode sto ga prethodno nije objasnio.
I tako, treći jubilarni put tebi, a ko zna koji put inače, kažem da ostaviš na stranu knjigu C++ za 21 dan i uzmeš nešto bolje. :) Šta o knjigama za učenje programiranja za 21 dan kaže veliki sensei Peter Norvig, autor biblije „Artificial Intellivence: A Modern Approach“ i trenutno vodeći stručnjak firme Google, možeš pročitati na njegovoj stranici „Learn Programming in 10 years“ na adresi:
http://www.norvig.com/21-days.html
Citat:
Code:
SimpleCat::SimpleCat(int age, int weight) :
itsAge(age), itsWeight(weight) {}
Rekao bih da je ovo analogno sa:
Code:
SimpleCat::SimpleCat(int age, int weight)
{
itsAge = age;
itsWeight = weight;
}
I jeste ali i nije. U slučaju ugrađenih tipova poput int, char i slično, efekat je potpuno isti. Ali ako treba inicijalizovati neki objekat koji je uključen u našu klasu, videćeš da je to jedini mogući način da se objekat inicijalizuje. Pošto primer govori više od hiljadu reči, zamislimo da imamo klasu
Citat:
class VelikaKlasa {
VelikaKlasa();
private:
int obicnaPromenljiva;
MalaKlasa neobicnaPromenljiva;
}
Pri konstrukciji VelikeKlase treba dodeliti početne vrednosti i običnoj i neobičnoj promenljivoj. Iako je kao, što si primetio, za tip int svejedno gde će se naći inicijalizacija, za MaluKlasu jedini izlaz je inicijalizacija posle operatora „:“, jer je ovo sintaksno neispravno:
Citat:
VelikaKlasa::VelikaKlasa() {
obicnaPromenljiva = 0;
neobicnaPromenljiva(pocetnaVrednost); // ovo je neispravno
neobicnaPromenljiva = pocetnaVrednost; // ovo je neispravno osim ako ne definišeš operator dodele
}
Dodatni problem je što
pre nego što počne da se izvršava telo konstruktora, za obe promenljive se mora alocirati prostor (zbog tipa agregacije) što znači da se implicitno za neobicnuPromenljivu poziva default konstruktor
pre nego što se krene sa izvršavanjem tela konstruktora naše VelikeKlase, što nije uvek ono što želiš.
Drugim rečima, ako bi se sve radilo bez dvotačke, morao bi em da definišeš dodatni operator, u ovom slučaju recimo =, em bi se konstrukcija sadržane klase obavezno radila
dvaput, i to bez potrebe!. Zato je i uvedena lista za inicijalizaciju. A čisto da ilustrujem kako to izgleda u dobrim knjigama o C++-u, reći ću ti da čika Bjarne sasvim lepo i detaljno objašnjava gore pomenutu anomaliju u „The C++ Programming Language“.
Ostaje zaključak da se mora uraditi ovako:
Citat:
VelikaKlasa::VelikaKlasa() : neobicnaPromenljiva(pocetnaVrednost),
obicnaPromenljiva(0)
{
// obicnaPromenljiva = 0; // moglo je i ovde da stoji umesto gore
}
Citat:
Code:
float Employee : GetRoundedThousands() const
{
return Salary/1000
}
Sta znaci ovo?
Ovaj kod sigurno nije dobar. Naime ako ništa drugo, a ono fali tačka i zapeta kao oznaka za kraj naredbe posle konstante 1000. A kao drugo mislim da je u pitanju česta greška koju prave izdavači koji svoje knjige formatiraju u wordu ili nekoj sličnoj gluposti. U tvom primeru fali još jedna dvotačka posle Employee i jedna tačka i zapeta posle 1000 da bi definicija funkcije bila ispravna. Pošto u oba slučaja fali interpunkcija rekao bih da je neko zeznuo stvar pri copy/paste u pripremi knjige.
f