2013-07-24 6 views
5

Während ich dokumentiere, auf welche statischen Mitglieder ich zugreifen darf und was nicht this Code Beispiel ist, und ich erinnerte mich, ich habe es vorher gesehen und ich wusste nicht, wofür es ist und was es tut?C++ - Was bedeutet der Name nach der schließenden Klassenklammer?

Ich habe im Internet gesucht, aber ohne Glück, und das ist, weil Menschen in der Regel versuchen, ihre Probleme zu beheben, ohne an ein größeres Publikum mit dem gleichen Problem zu denken und deshalb erstellen sie keine generischen Namen, um es einfacher zu machen suchen!

Code:

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); 
} 

Also, ich bin interessiert, was tut g_c nach der letzten Klasse Bügelmittel?

Jede Hilfe wird geschätzt.

Antwort

10
} g_c; 

Hier g_c erklärt C ein Objekt der Klasse Typ sein.

Ein solches Konstrukt ermöglicht es Ihnen, Objekt (e) von unbenannte Art zu erstellen:

class //Nameless class! 
{ 
    //data members 

}obj1, obj2; 

In diesem Beispiel obj1 und obj2 deklariert Objekte einer Klasse-Typ sein, die einen beliebigen Namen nicht gegeben hat — Die Klasse ist namenlos! In einer solchen Situation können Sie Objekte nicht in einem herkömmlichen Sinne (d. H. Type obj1, obj2; Sinn) deklarieren. Dieses Konstrukt hilft dir dabei.

Sie können auch von anderen namens Klassen ableiten, während namenlos zu sein (und die Objekte der namenlos Klasse erklärt):

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

}obj1, obj2; 

Kurz gesagt, stellt sicher, dieses Konstrukt, dass der Benutzer nicht sein würde, Lage mehr Objekte zu schaffen als gedacht, es sei denn, einige bösen Programmierer nutzen/Missbrauch/Mißbräuche 11 C++ (oder Vorlage) als:

decltype(obj1) obj3; //hehe! 

Hoffe das hilft!

+1

Vielen Dank für das zusätzliche Wissen. Ich wusste nicht, dass du das kannst. –

12

Es ist eine Abkürzung für:

class C 
{ 
    .... 
}; 

C g_c; 
+0

So ist es wie die Instanz in die Klasse g_c direkt nach der Definition und g_c ist wie jede normale Klasseninstanz? –

+0

Ja, das ist korrekt –

+0

Danke, dass Sie es deutlich machen. –

1

Das ist nur eine Möglichkeit, Objekte dieser Art von Klasse zu erstellen. Structs verwenden sie meistens, um neue Variablen zu initialisieren.

1

Sie deklarieren Variablen im Format type variable_name;. Zum Beispiel:

A x; 

Dabei kann A der Name einer Klasse sein.

Doch statt einen bereits bestehenden Klassentyp zu verwenden, können Sie auch die Klasse zur gleichen Zeit definieren, wie Sie eine Variable deklarieren, die es verwendet:

class { ... } x; 

oder die Klasse definieren und ihm einen Namen geben :

class A { ... } x; 

In C++ ist es üblich, einen Namen, nur die Klasse zu definieren und geben sie es, aber die Variable weglassen:

class A { ... }; 

aber Sie müssen die Variable nicht verlassen.