2013-07-24 13 views
5

Podczas dokumentowania, do których statycznych członków można uzyskać dostęp, a czego nie napotkałem na przykładzie kodu this i przypomniałem sobie, że widziałem go wcześniej i nie wiedziałem, do czego służy i co robi?C++ - Co oznacza nazwa po nawiasie zamykającym?

Szukałem w Internecie, ale bez powodzenia, a to dlatego, że zazwyczaj ludzie próbują naprawić swoje problemy bez myślenia o większej grupie odbiorców z tym samym problemem i dlatego nie tworzą ogólnych nazw, aby ułatwić im szukać!

Kod:

class C 
{ 
    int x; // a non-static variable, implicitly private 

public: 
    C() : x(0) {} // default constructor 

    // a static member function, which uses a non-static variable perfectly well 
    static int Incr(C& instance) { return ++(instance.x); } 
} g_c; 

int main(void) 
{ 
    C c2; 
    return C::Incr(g_c) + C::Incr(c2); 
} 

Tak, jestem zainteresowany, co robi g_c po ostatniej klasie pomocą uchwytów?

Każda pomoc jest doceniana.

Odpowiedz

10
} g_c; 

Tutaj g_c jest uznany za obiekt typu klasy C.

Taka konstrukcja umożliwia utworzenie obiektu (ów) bezimiennego typu jak:

class //Nameless class! 
{ 
    //data members 

}obj1, obj2; 

W tym przykładzie obj1 i obj2 są uznane za obiekty typu klasy, która nie została przekazana dowolną nazwę — klasa jest bezimienna ! W takiej sytuacji nie można zadeklarować obiektów w konwencjonalnym znaczeniu (tj. Type obj1, obj2; sens). Ta konstrukcja pomaga ci to zrobić.

Można nawet czerpać z innych nazwanych klas będąc bezimienny (i deklarowania obiektów bezimiennego klasa):

class : public A, public B //Nameless class is deriving from A and B 
{ 
    //data members 

}obj1, obj2; 

w skrócie, to konstrukcja sprawia, że ​​użytkownik nie będzie w stanie stworzyć więcej przedmiotów niż z przeznaczeniem, chyba że jakiś zły programista używa/nadużyciom/C++ 11 nadużyć (lub szablon) jako:

decltype(obj1) obj3; //hehe! 

Nadzieję, że pomaga!

+1

Dziękuję za dodatkową wiedzę. Nie wiedziałem, że możesz to zrobić. –

12

To skrót od:

class C 
{ 
    .... 
}; 

C g_c; 
+0

Czyli tworzenie instancji w g_c następuje zaraz po zdefiniowaniu jej, a g_c jest jak normalna instancja klasy? –

+0

Tak, zgadza się –

+0

Dziękuję za wyjaśnienie. –

1

To tylko sposób na tworzenie obiektów tego typu klasy. Struktury najczęściej wykorzystują je do inicjowania nowych zmiennych.

1

Użytkownik deklaruje zmienne za pomocą formatu type variable_name;. Na przykład:

A x; 

Gdzie A może być nazwą klasy.

Ale zamiast używać wstępnie istniejącego typu klasy, można również zdefiniować klasę w tym samym czasie, jak zadeklarować zmienną, która używa go:

class { ... } x; 

lub zdefiniować klasę i nadać mu nazwę :

class A { ... } x; 

W C++ powszechne jest po prostu zdefiniować klasę i nadać mu nazwę, ale pozostawić poza zmienną:

class A { ... }; 

, ale nie musisz rezygnować ze zmiennej.