Deklarationen und DefinitionenC++()Declarations and definitions (C++)

Ein C++ Programm besteht aus verschiedenen Entitäten, z. b. Variablen, Funktionen, Typen und Namespaces.A C++ program consists of various entities such as variables, functions, types, and namespaces. Jede dieser Entitäten muss deklariert werden, bevor Sie verwendet werden können.Each of these entities must be declared before they can be used. Eine-Deklaration gibt einen eindeutigen Namen für die Entität an, zusammen mit Informationen über ihren Typ und andere Merkmale.A declaration specifies a unique name for the entity, along with information about its type and other characteristics. An C++ dem Punkt, an dem ein Name deklariert wird, ist der Punkt, an dem er für den Compiler sichtbar wird.In C++ the point at which a name is declared is the point at which it becomes visible to the compiler. Sie können nicht auf eine Funktion oder Klasse verweisen, die zu einem späteren Zeitpunkt in der Kompilierungseinheit deklariert wird.You cannot refer to a function or class that is declared at some later point in the compilation unit. Variablen sollten vor dem Zeitpunkt, an dem Sie verwendet werden, so nah wie möglich sein.Variables should be declared as close as possible before the point at which they are used.

Das folgende Beispiel zeigt einige Deklarationen:The following example shows some declarations:

#include <string>

void f(); // forward declaration

int main()
{
    const double pi = 3.14; //OK
    int i = f(2); //OK. f is forward-declared
    std::string str; // OK std::string is declared in <string> header
    C obj; // error! C not yet declared.
    j = 0; // error! No type specified.
    auto k = 0; // OK. type inferred as int by compiler.
}

int f(int i)
{
    return i + 42;
}

namespace N {
   class C{/*...*/};
}

In Zeile 5 wird die main-Funktion deklariert.On line 5, the main function is declared. In Zeile 7 wird eine Konstante Variable mit dem Namen pi deklariert und Initialisiert.On line 7, a const variable named pi is declared and initialized. In Zeile 8 wird ein Integer-i deklariert und mit dem Wert initialisiert, der von der Funktion ferzeugt wird.On line 8, an integer i is declared and initialized with the value produced by the function f. Der Name f der für den Compiler aufgrund der Vorwärts Deklaration in Zeile 3 sichtbar ist.The name f is visible to the compiler because of the forward declaration on line 3.

In Zeile 9 wird eine Variable mit dem Namen obj vom Typ C deklariert.In line 9, a variable named obj of type C is declared. Diese Deklaration löst jedoch einen Fehler aus, da C bis zu einem späteren Zeitpunkt im Programm nicht deklariert wird und nicht vorwärts deklariert ist.However, this declaration raises an error because C is not declared until later in the program, and is not forward-declared. Um den Fehler zu beheben, können Sie entweder die gesamte Definition des C vor main verschieben oder eine vorwärts Deklaration dafür hinzufügen.To fix the error, you can either move the entire definition of C before main or else add a forward-declaration for it. Dieses Verhalten unterscheidet sich von anderen Sprachen wie C#z. b., in denen Funktionen und Klassen vor dem Zeitpunkt der Deklaration in einer Quelldatei verwendet werden können.This behavior is different from other languages such as C#, in which functions and classes can be used before their point of declaration in a source file.

In Zeile 10 wird eine Variable mit dem Namen str vom Typ std::string deklariert.In line 10, a variable named str of type std::string is declared. Der Name std::string ist sichtbar, da er in der string Header Datei eingeführt wird, die in Zeile 1 in der Quelldatei zusammengeführt wird.The name std::string is visible because it is introduced in the string header file which is merged into the source file in line 1. std ist der Namespace, in dem die string Klasse deklariert wird.std is the namespace in which the string class is declared.

In Zeile 11 wird ein Fehler ausgelöst, da der Name j nicht deklariert wurde.In line 11, an error is raised because the name j has not been declared. Eine Deklaration muss einen Typ bereitstellen, im Gegensatz zu anderen Sprachen wie javaScript.A declaration must provide a type, unlike other languages such as javaScript. In Zeile 12 wird das auto-Schlüsselwort verwendet, das den Compiler anweist, den Typ der k basierend auf dem Wert abzuleiten, mit dem Sie initialisiert wird.In line 12, the auto keyword is used, which tells the compiler to infer the type of k based on the value that it is initialized with. Der Compiler wählt in diesem Fall int für den Typ aus.The compiler in this case chooses int for the type.

Gültigkeitsbereich der DeklarationDeclaration scope

Der von einer Deklaration eingeführte Name ist innerhalb des Bereichs gültig, in dem die Deklaration auftritt.The name that is introduced by a declaration is valid within the scope where the declaration occurs. Im vorherigen Beispiel sind die Variablen, die innerhalb der main Funktion deklariert werden, lokale Variablen.In the previous example, the variables that are declared inside the main function are local variables. Sie können eine andere Variable mit dem Namen i außerhalb von Main im globalen Gültigkeits Bereichdeklarieren, und es wäre eine vollständig getrennte Entität.You could declare another variable named i outside of main, at global scope, and it would be a completely separate entity. Eine solche Duplizierung von Namen kann jedoch zu Verwirrung und Fehlern im Programmierer führen und sollte vermieden werden.However, such duplication of names can lead to programmer confusion and errors, and should be avoided. In Zeile 21 wird die Klasse C im Gültigkeitsbereich des Namespace Ndeklariert.In line 21, the class C is declared in the scope of the namespace N. Durch die Verwendung von Namespaces können Namenskollisionenvermieden werden.The use of namespaces helps to avoid name collisions. Die C++ meisten Standard Bibliotheksnamen werden innerhalb des std-Namespace deklariert.Most C++ Standard Library names are declared within the std namespace. Weitere Informationen darüber, wie Bereichs Regeln mit Deklarationen interagieren, finden Sie unter Scope.For more information about how scope rules interact with declarations, see Scope.

DefinitionenDefinitions

Einige Entitäten, einschließlich Funktionen, Klassen, enumerationseinheiten und Konstanten Variablen, müssen zusätzlich zu den deklarierten definiert werden.Some entities, including functions, classes, enums, and constant variables, must be defined in addition to being declared. Eine Definition stellt dem Compiler alle Informationen zur Verfügung, die er benötigt, um Computercode zu generieren, wenn die Entität später im Programm verwendet wird.A definition provides the compiler with all the information it needs to generate machine code when the entity is used later in the program. Im vorherigen Beispiel enthält Zeile 3 eine Deklaration für die-Funktion f aber die Definition für die-Funktion wird in den Zeilen 15 bis 18 bereitgestellt.In the previous example, line 3 contains a declaration for the function f but the definition for the function is provided in lines 15 through 18. In Zeile 21 ist die Klasse C deklariert und definiert (obwohl die Klasse so definiert ist, dass Sie nichts tut).On line 21, the class C is both declared and defined (although as defined the class doesn't do anything). Eine Konstante Variable muss in derselben Anweisung, in der Sie deklariert ist, mit anderen Worten einem Wert zugewiesen werden.A constant variable must be defined, in other words assigned a value, in the same statement in which it is declared. Eine Deklaration eines integrierten Typs, wie z. b. int, ist automatisch eine Definition, da der Compiler weiß, wie viel Speicherplatz dafür belegt werden soll.A declaration of a built-in type such as int is automatically a definition because the compiler knows how much space to allocate for it.

Das folgende Beispiel zeigt Deklarationen, die auch Definitionen sind:The following example shows declarations that are also definitions:

// Declare and define int variables i and j.
int i;
int j = 10;

// Declare enumeration suits.
enum suits { Spades = 1, Clubs, Hearts, Diamonds };

// Declare class CheckBox.
class CheckBox : public Control
{
public:
    Boolean IsChecked();
    virtual int     ChangeState() = 0;
};

Es folgen einige Deklarationen, die keine Definitionen sind:Here are some declarations that are not definitions:

extern int i;
char *strchr( const char *Str, const char Target );

Typedefs und using-AnweisungenTypedefs and using statements

In älteren Versionen von C++wird das typedef -Schlüsselwort verwendet, um einen neuen Namen zu deklarieren, der ein Alias für einen anderen Namen ist.In older versions of C++, the typedef keyword is used to declare a new name that is an alias for another name. Beispielsweise ist der Typ std::string ein anderer Name für std::basic_string<char>.For example the type std::string is another name for std::basic_string<char>. Es sollte offensichtlich sein, warum Programmierer den Typedef-Namen und nicht den tatsächlichen Namen verwenden.It should be obvious why programmers use the typedef name and not the actual name. In modernen C++ist das using -Schlüsselwort als typedef vorzuziehen, aber die Idee ist identisch: ein neuer Name wird für eine Entität deklariert, die bereits deklariert und definiert ist.In modern C++, the using keyword is preferred over typedef, but the idea is the same: a new name is declared for an entity which is already declared and defined.

Statische KlassenmemberStatic class members

Da statische Klassendatenmember diskrete Variablen sind, die von allen Objekten der Klasse gemeinsam genutzt werden, müssen Sie außerhalb der Klassendefinition definiert und initialisiert werden.Because static class data members are discrete variables shared by all objects of the class, they must be defined and initialized outside the class definition. (Weitere Informationen finden Sie unter Klassen.)(For more information, see Classes.)

externe Deklarationenextern declarations

Ein C++ Programm kann mehr als eine Kompilierungseinheitenthalten.A C++ program might contain more than one compilation unit. Verwenden Sie zum Deklarieren einer Entität, die in einer separaten Kompilierungseinheit definiert ist, das extern -Schlüsselwort.To declare an entity that is defined in a separate compilation unit, use the extern keyword. Die Informationen in der Deklaration sind für den Compiler ausreichend, aber wenn die Definition der Entität im Verknüpfungs Schritt nicht gefunden werden kann, gibt der Linker einen Fehler aus.The information in the declaration is sufficient for the compiler, but if the definition of the entity cannot be found in the linking step, then the linker will raise an error.

In diesem AbschnittIn this section

SpeicherklassenStorage classes
constconst
constexprconstexpr
externextern
InitialisiererInitializers
Aliasse und TypdefinitionenAliases and typedefs
using-Deklarationusing declaration
volatilevolatile
decltypedecltype
Attribute inC++Attributes in C++

Weitere InformationenSee also

Grundlegende KonzepteBasic Concepts