2010-02-16 9 views
5

Za dużo C# i za mało C++ sprawia, że ​​mam zawroty głowy ... Czy ktoś mógłby mi przypomnieć, co oznacza ta deklaracja C++? W szczególności zakończenie "const". Wielkie dzięki.Nie rozumiem deklaracji metody const

protected: 
    virtual ostream & print(ostream & os) const 
+0

Dzięki Daniel, edytowania go dla mnie. : D – smwikipedia

Odpowiedz

10

const metoda będzie po prostu otrzymać constthis wskaźnik.

W tym przypadku wskaźnik this będzie typu const ThisClass* const zamiast zwykłego typu ThisClass* const.

Oznacza to, że zmienne składowe nie mogą być modyfikowane z metody const. Nie można nawet wywoływać metod z tej metody. Jednak zmienna składowa może być zadeklarowana jako mutable, w którym to przypadku to ograniczenie nie będzie miało do niej zastosowania.

Dlatego jeśli masz obiekt const, jedynymi metodami, które kompilator umożliwia wywołanie są te oznaczone jako bezpieczne przez słowo kluczowe const.

+4

+1 za wzmianka o "tym" będącym "const". – Blindy

+1

, chyba że członkowie są oznaczeni jako zmienne – pm100

+0

@ pm100: Dzięki. Dodano notatkę o zmiennym członku. –

4

Końcówka const oznacza, że ​​funkcja print nie powinien być w stanie zmienić stan któregokolwiek z członków klasy jest zadeklarowany w (i dlatego nie może wywołać żadnych funkcji członka tej klasy, które nie są również zadeklarował const).

W poniższym przykładzie funkcja w klasie Fooprint nie może zmienić każdy ze zmiennych należących Foo (chyba że są one zadeklarowane mutable), i nie może wywołać żadnych funkcji non-const w Foo.

class Foo { 
public: 
    Foo(string value) { m_value = value; } 
protected: 
    ostream & print(ostream & os) const { 
     m_value = string("foobar"); // won't compile 
     os << m_value; 
     return os; 
    } 
private: 
    string m_value; 
}; 
3

const w deklaracji metody informuje kompilator, że funkcja jest bezpieczna zadzwonić na const obiektu typu funkcja jest członkiem. Sygnalizuje również kompilatorowi, że funkcja nie ma na celu zmiany stanu obiektu i nie będzie w stanie zmienić żadnych zmiennych składowych, które nie są oznaczone jako mutable.

Jeśli pominąć const, ten kod nie zadziała:

const Foo bar; 
bar.print(std::cout); // Will fail to compile unless 'print' is marked const 
1

Podajesz chronioną wirtualną metodę o nazwie print, która przyjmuje jako parametr odniesienie do ostream i zwraca odniesienie do ostream.

Słowo kluczowe const oznacza, że ​​metoda nie będzie w stanie zmienić stanu obiektu, a wskaźnik będzie stały.

Metoda wirtualna to metoda, której zachowanie można przesłonić w ramach klasy dziedziczącej, w zasadzie wirtualne słowo kluczowe nadaje C++ jego zdolność do wspierania polimorfizmu.

I wreszcie, jeśli nie wiem, co jest nawiązaniem go there

Comming z C# Przypuszczam wiesz co zabezpieczone środki :)

Powiązane problemy