2009-10-11 25 views
28

MSDN'ye göre: "Bir üye işlevinin parametre listesini izlediğinde, const anahtar sözcüğü, işlevin çağrılan nesneyi değiştirmediğini belirtir."Bir işlev/yöntem imzası sonrasında const nedir?

Birisi bunu biraz açıklayabilir mi? İşlev, nesnenin üyelerinden herhangi birini değiştiremediği anlamına mı geliyor?

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

[zaman, onun da sınıfına atıfta açıklanmasından sonra 'bu'] (http://stackoverflow.com/questions/10982628/non-member-function-cannot- have-cv-niteleyici) –

cevap

33

Bu yöntem elemanı değişkenleri değiştirmek anlamına gelir (üyeleri hariç mutable olarak ilan), bu sınıfın sabit örneklerinde çağrılabilir.

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

"Sabit örneklerini" açıklayabilir misiniz? Belki küçük bir kodla? – Scott

+1

Bunu kazıyın. Sonuçta bazı kodları vermiş gibisin. – Scott

+1

C++ const-ness hakkında bilgi almak isteyeceksiniz. Const_iterator öğelerini const STL nesnelerini vb. Kullanmanız gerekecektir. – nall

2

derleyici const üye işlevi üye işlevi gelmez demektir @delroth tarafından cevap olarak şu ya da bu nesnenin

2

için const olmayan üye işlevini çağırmak * değiştirmesine izin vermez Değişken olarak bildirilenler dışındaki tüm katılımcı değişkenlerini değiştirmeyin. C++ here

16

'daki const doğruluğu hakkında iyi bir SSS görebilirsiniz. Ayrıca, üye işlevi değişebilir olarak işaretlenmemiş üye değişkenlerini değiştiremezken, üye değişkenleri işaretçilerse, üye işlevini değiştiremeyebilir. imleç değeri (örn. işaretçinin işaret ettiği adres), ancak işaretçinin işaret ettiği şeyi değiştirebilir (gerçek bellek bölgesi). Yani, örneğin

:

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

İyi nokta. Const-pointer-int, pointer-const-int ve const-pointer-const-int arasındaki farktır. const yöntemleri işaretçi yapısını oluşturur. – UncleBens

+0

Muhtemelen "... değişkenleri _not_ olarak değiştirilemez ..." anlamına gelir. – sbi

+0

Oops, haha. Bunun için üzgünüm. – blwy10