2009-10-11 17 views
28

Według MSDN: "Gdy następuje lista parametrów funkcji elementu, słowo kluczowe const określa, że ​​funkcja nie modyfikuje obiektu, dla którego jest wywoływana."Co oznacza const po podpisie funkcji/metody?

Czy ktoś może to trochę wyjaśnić? Czy oznacza to, że funkcja nie może modyfikować żadnego z elementów obiektu?

bool AnalogClockPlugin::isInitialized() const 
{ 
    return initialized; 
} 
+0

[Gdy po jego deklaracji odnoszącej się do jego klasy 'to'] (http://stackoverflow.com/questions/10982628/non-member-function-cannot- have-cv-qualifier) ​​ –

Odpowiedz

33

Oznacza to, że metoda nie modyfikować zmienne (z wyjątkiem członków zadeklarowane jako mutable), więc można go nazwać na stałych instancji klasy.

class A 
{ 
public: 
    int foo() { return 42; } 
    int bar() const { return 42; } 
}; 

void test(const A& a) 
{ 
    // Will fail 
    a.foo(); 

    // Will work 
    a.bar(); 
} 
+0

Czy możesz wyjaśnić "ciągłe instancje?" Może z małym kodem? – Scott

+1

Zdrap to. Wygląda na to, że podałeś jakiś kod. – Scott

+1

Będziesz chciał przeczytać o C++ const-ness. Będziesz musiał użyć const_iterator's na stałych obiektach STL itp. – nall

2

Kompilator nie pozwoli const funkcji członka zmienić to * lub wywołać non-const funkcji członka tego obiektu

2

Jak odpowiedział @delroth oznacza to, że funkcja członek nie robi Zmodyfikuj dowolną zmienną memeber z wyjątkiem tych, które zostały zadeklarowane jako zmienne. Można zobaczyć dobrą nas o const prawidłowości w C++ here

16

Należy również zauważyć, że podczas gdy funkcja Użytkownik nie może modyfikować zmienne składowe nie oznaczone jako zmienne, jeżeli zmienne składowe są wskaźniki, funkcja członek nie może być w stanie zmodyfikować wartość wskaźnika (tj. adres, na który wskazuje wskaźnik), ale może modyfikować wskaźnik wskazywany przez wskaźnik (rzeczywisty obszar pamięci).

Tak na przykład:

class C 
{ 
public: 
    void member() const 
    { 
     p = 0; // This is not allowed; you are modifying the member variable 

     // This is allowed; the member variable is still the same, but what it points to is different (and can be changed) 
     *p = 0; 
    } 

private: 
    int *p; 
}; 
+1

Dobra uwaga. Jest to różnica między const-pointer-int, point-to-const-int i const-pointer-to-const-int. metody const powodują, że wskaźnik jest stały. – UncleBens

+0

Prawdopodobnie masz na myśli "... zmienne składowe _nie_ oznaczone jako zmienne ...". – sbi

+0

Ups, haha. Przepraszam za to. – blwy10