2017-06-13 14 views
6

[expr.ref]/1:[expr.ref]/1 de belirtilen dipnotun anlamı nedir?

bir nokta . veya bir ok -> ardından bir sonek ifadesi, isteğe bağlı olarak bir anahtar kelime template (17.2), edildi ve daha sonra, bir kimliği ifade, ardından bir sonek ifadesidir. Nokta veya ok 'dan önceki postfix ifadesi değerlendirilir; Bu değerlendirmenin sonucu, kimlik tanımlaması ile birlikte tüm postfix ifadesinin sonucunu belirler. sınıf üyesi ifade değerlendirilmişse

67), alt ifade değerlendirme sonucu kimliği ifade statik elemanı anlamına geldiğinde, örneğin, tüm sonek ifade değerini belirlemek gereksizdir bile gerçekleşir .

cevap

6

Bir üye static olarak tanımlanırsa, o sınıfın her kopyası için bir kopya değil, sınıf için yalnızca bir kopyası vardır. Statik üyeler, sınıfın bir örneği (nesnesi) aracılığıyla başvuruda bulunabilir. Dipnot, örneğini tanımlayan ifadenin, statik öğenin değerini bilmek için erişmekte olduğunuz örnek nesnesini bilmenize gerek olmasa bile değerlendirildiğini (ve herhangi bir yan etki gerçekleştiğini) açıklığa kavuşturur.

Örnek: Tek bir s nesne ve değeri 42 olmakla birlikte, sentezleme arr[index()] hala sonuç s değerini belirlemek için gerekli olmasa da, değerlendirilir

#include <iostream> 

class foo { 
    public: 
     static int s; 
}; 

int foo::s = 42; 

int index() { 
    std::cout << "index returns 5\n"; 
    return 5; 
} 

int main() { 
    foo arr[10]; 
    std::cout << arr[index()].s << "\n"; 
} 

.

çıktısı:

index returns 5 
42 
+0

teşekkürler. Daha net olamazdı. – Alexander