[C++]Const przy funkcji, Symfonia C++

0

Witam,
właśnie kończę czytać Symfonię C++. Wkroczyłem do przedostatniego rozdziału tj. Operacje Wejścia/Wyjścia. No i mam mały problem bo nie rozumiem pewnego zapisu, które jest dość często stosowane przez autora tzn. przy deklaracji/opisie funkcji autor pisze mniej więcej tak: typ nazwa_funkcji() const; np. streamsize precision() const;
Moje pytanie to: dlaczego const jest na końcu?!? co to w ogóle znaczy? :(

Obawiam się, że o czymś zapomniałem (tą książkę zamierzam i tak przeczytać jeszcze raz bo to zbyt duży materiał jak na jeden raz) ale nie kojarzę, żeby stawiać const na końcu. Sam już nie wiem :/

Drugie pytanie dot. struktur. Spotkałem się z czymś takim, że ktoś pisze najpierw zmienne w strukturze a po "ciele" daje jej nazwę - czy to normalne? czy można sobie stawiać nazwę raz przed ciałem a raz po? tzn. np. według mnie powinno być tak:

struct nazwa_struktury
   { int cos;
   //pozostałe zmienne
   }; 

Natomiast ja widziałem coś w stylu:

struct
   { int cos;
   //pozostałe zmienne
   } nazwa_struktury;

Czy to jest jedno i to samo? czy ma to jakieś znaczenie?

Bardzo proszę bardziej doświadczone osoby o pomoc.
Z góry dziękuję!

0

const member functions:
http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.10
http://msdn.microsoft.com/en-us/library/6ke686zh.aspx
http://www.possibility.com/Cpp/const.html
http://c2.com/cgi/wiki?UseConstMemberFunctions

Drugie pytanie dot. struktur. Spotkałem się z czymś takim, że ktoś pisze najpierw zmienne w strukturze a po "ciele" daje jej nazwę - czy to normalne? czy można sobie stawiać nazwę raz przed ciałem a raz po? tzn. np. według mnie powinno być tak:

struct nazwa_struktury
   { int cos;
   //pozostałe zmienne
   }; 

Natomiast ja widziałem coś w stylu:

struct
   { int cos;
   //pozostałe zmienne
   } nazwa_struktury;

Czy to jest jedno i to samo? czy ma to jakieś znaczenie?

To nie jest jedno i to samo, mam wrażenie, że widziałeś raczej to:

typedef struct
   { int cos;
   //pozostałe zmienne
   } nazwa_struktury;
0

const na końcu funkcji informuje, że funkcja nie zmienia obiektu na rzecz którego jest wywoływana

0

Nie tylko informuje, ale wręcz tylko takie metody mogą być wywołane na obiekcie, który odziedziczył const. :)
edit: Uściślając, obiekty const mogą wywołać tylko i wyłącznie metody, które są const.

0

Eeee... @Azrael_Valedhel bzdury pleciesz, to się ładnie skompiluje i uruchomi:

class Foo {
public:
	void bar() const {}
};

int main() {
	Foo f1;
	const Foo f2 = f1;
	f1.bar();
	f2.bar();
}
0

dziękuję bardzo za odpowiedzi! :) Teraz mi zaczyna coś świtać w głowie :P. Znacznie lepiej przyswoiłem sobie te "const" ze zmiennymi...

Azrael_Valedhel napisał(a)

const member functions:
To nie jest jedno i to samo, mam wrażenie, że widziałeś raczej to:

typedef struct
   { int cos;
   //pozostałe zmienne
   } nazwa_struktury;

Dokładnie to widziałem! Czy mógłbyś mi tak na szybko wyjaśnić w czym rzecz? Czym to się różni od zwykłej struktury?
Pozdrawiam i jeszcze raz dziękuję za pomoc :)

0
Please napisał(a)

dziękuję bardzo za odpowiedzi! :) Teraz mi zaczyna coś świtać w głowie :P. Znacznie lepiej przyswoiłem sobie te "const" ze zmiennymi...

Azrael_Valedhel napisał(a)

const member functions:
To nie jest jedno i to samo, mam wrażenie, że widziałeś raczej to:

typedef struct
   { int cos;
   //pozostałe zmienne
   } nazwa_struktury;

Dokładnie to widziałem! Czy mógłbyś mi tak na szybko wyjaśnić w czym rzecz? Czym to się różni od zwykłej struktury?
Pozdrawiam i jeszcze raz dziękuję za pomoc :)

Niczym prócz zapisu się nie różni w C++. W C jest chyba taka różnica, że nie trzeba pisać struct przed nazwą typu, ale nie jestem pewien.

0
winerfresh napisał(a)

Eeee... @Azrael_Valedhel bzdury pleciesz, to się ładnie skompiluje i uruchomi:

class Foo {
public:
	void bar() const {}
};

int main() {
	Foo f1;
	const Foo f2 = f1;
	f1.bar();
	f2.bar();
}

Za szybko wystrzeliłeś. :)
Metody const można wywołać zarówno z obiektu const jak i obiektu nie-const, ale ja nie o tym pisałem. Wręcz przeciwnie, napisałem, że obiekty const mogą wywoływać tylko metody const.

0

Dziękuję bardzo za odpowiedzi :).
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1