2015-01-18 17 views
10

Zanim ktokolwiek zapyta, tak, jest to część pracy domowej, i tak, przed pytaniem dużo zrobiłem. Spędziłem ostatnią godzinę intensywnie przeszukując Google za pomocą wielu, wielu różnych słów kluczowych, ale po prostu nie mogłem nic znaleźć.Słowo kluczowe "klasa" w definicji zmiennej w C++

Więc oto idzie na pytanie:

Co robi następującą zmienną średnią definicja: class MyClass* myClass;?

Próbowałem tego kodu z czymś takim jak class MyClass* myClass = new MyClass(); i odkryłem, że po prostu tworzy wskaźnik do nowego wystąpienia MyClass.

Jaka jest korzyść z używania prefiksu class? Czy to ma jakieś znaczenie?

Czy ktoś ma link do niektórych zasobów na ten temat? Po prostu nie mogłem nic znaleźć (naprawdę ciężko znaleźć rzeczy inne niż "definicja klasy"!).

Wielkie dzięki!

+0

Czy możesz podać kontekst, w którym to zobaczyłeś? Czy była to zmienna składowa w klasie? Wydaje mi się, że może to być deklaracja terminowa połączona z deklaracją zmiennej. – Borgleader

+0

Prawie nigdy tego nie potrzebujesz. Jednym z niejasnych przypadków jest ukrywanie nazwy klasy przez zmienną lub funkcję: 'class MyClass {}; int MyClass; MyClass * myClass = NULL; '(nie będzie kompilował, ale możesz dodać słowo kluczowe" class ", aby odwołać się do ukrytej nazwy). –

Odpowiedz

13

Rozbudowany specyfikator typu to nazwa typu poprzedzona słowem kluczowym class, struct, enum lub union.

class identifier 
struct identifier 
enum identifier 
union identifier 

opracowana specyfikacja typu jest stosowany zarówno dla podkreślenia, lub ujawnić nazwę typu, który jest ukryty w deklaracji zmiennej o tej samej nazwie w tym samym zakresie.

source

+0

Plus 1 za wzmiankę o opracowanych specyfikatorach typów – namezero

6

W rzeczywistości jest to opcjonalne użycie class podczas tworzenia obiektu klasy. W języku C jest obowiązkowe użycie przed nazwą struct nazwy struct w celu utworzenia jej zmiennej. Ponieważ C++ jest nadzbiorem C. Istnieje tylko jedna różnica między strukturą a klasą w C++ i jest to modyfikator dostępu.

Aby zachować kompatybilność wsteczną, jest to dopuszczalne.

Więc

class MyClass* myClass = new MyClass(); 

I

MyClass* myClass = new MyClass(); 

Obie są takie same.

+2

C++ jest * prawie * nadzbiorem C. Również twoja odpowiedź początkowo odnosiła się do C w czasie przeszłym; C nadal istnieje, a zasady w tym obszarze pozostają niezmienione. –

1

Słowa "inline naprzód deklaracja" należy tu wymienić!

Deklaracja przekazania jest po prostu sposobem poinformowania kompilatora o nazwie typu, zanim zostanie faktycznie zdefiniowana. Znajdziesz je w plikach nagłówkowych przez cały czas.

// MyStruct.h 
class MyClass; 

struct MyStuct { 
    MyClass* m_myClass; 
    void foo(); 
} 

// MyStruct.cpp 
#inlude "MyClass.h" 
void MyStruct::foo() { m_myClass->SomeFunc(); } 

Zauważ, że tylko plik nagłówka deklaruje MojaKlasa jako identyfikator klasy, i nie ma pojęcia, co to właściwie jest, aż jego zdefiniowane przez #include w pliku cpp. To jest deklaracja przekazania.

Inline deklaracja forward to naprawdę to samo, ale po prostu robisz to wszystko w jednym wierszu. To jest ten sam dokładny kod, który osiąga to samo.

// MyStruct.h 
struct MyStuct { 
    class MyClass* m_myClass; 
    void foo(); 
} 

// MyStruct.cpp 
#inlude "MyClass.h" 
void MyStruct::foo() { m_myClass->SomeFunc(); } 

Czuję, że większość programistów preferuje standardową metodę deklaracji do przodu (zwykle mniej typowania). Dlatego może być mylące, gdy natkniemy się na mniejszą, używaną wersję inline.

Widzę wiele odpowiedzi tutaj, nazywając je opcjonalnym słowem kluczowym, ale w powyższym kontekście deklaracji forward, nie jest to bardzo opcjonalne i spowoduje błędy kompilacji z powodu brakującego specyfikatora typu.

+0

Standard C++ nie używa terminów "przekazywanie zgłoszenia" lub "deklaracja bezpośrednia". Standardowe terminy to "deklaracja" i "sprecyzowany typ specyfikacji", jak wspomniano w innym miejscu tego wątku. Być może błędnie przeczytałeś inną odpowiedź, która mówi: "W rzeczywistości jest to opcjonalne używanie' class' ** podczas tworzenia obiektu ** klasy "- aby utworzyć obiekt, typ musi być kompletny, a to jest rzeczywiście opcjonalne używać 'class' biorąc pod uwagę, że typ jest już kompletny. –

Powiązane problemy