Deklaracje i definicje (C++)

Program C++ składa się z różnych jednostek, takich jak zmienne, funkcje, typy i przestrzenie nazw. Każda z tych jednostek musi być zadeklarowana przed ich zastosowaniem. Deklaracja określa unikatową nazwę jednostki wraz z informacjami o jej typie i innych cechach. W języku C++ punkt, w którym zadeklarowana jest nazwa, jest punktem, w którym staje się widoczny dla kompilatora. Nie można odwołać się do funkcji lub klasy zadeklarowanej w późniejszym momencie w lekcji kompilacji. Zmienne powinny być deklarowane jak najbliżej punktu, w którym są używane.

W poniższym przykładzie przedstawiono niektóre deklaracje:

#include <string>

int f(int i); // forward declaration

int main()
{
    const double pi = 3.14; //OK
    int i = f(2); //OK. f is forward-declared
    C obj; // error! C not yet declared.
    std::string str; // OK std::string is declared in <string> header
    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{/*...*/};
}

W wierszu 5 zadeklarowana main jest funkcja . W wierszu 7 zmienna const o nazwie pi jest zadeklarowana i zainicjowana. W wierszu 8 zadeklarowana jest liczba całkowita i i zainicjowana przy użyciu wartości wygenerowanej przez funkcję f. Nazwa f jest widoczna dla kompilatora ze względu na deklarację przesyłania dalej w wierszu 3.

W wierszu 9 zadeklarowana jest zmienna o nazwie obj typu C . Jednak ta deklaracja zgłasza błąd, ponieważ C nie jest zadeklarowana dopiero później w programie i nie jest zadeklarowana do przodu. Aby rozwiązać ten problem, możesz przenieść całą definicjęC przed main lub dodać dla niego deklarację przesyłania dalej. To zachowanie różni się od innych języków, takich jak C#. W tych językach funkcje i klasy mogą być używane przed ich punktem deklaracji w pliku źródłowym.

W wierszu 10 zadeklarowana jest zmienna o nazwie str typu std::string . Nazwa std::string jest widoczna, ponieważ jest wprowadzana w pliku nagłówkowymstring, który jest scalony z plikiem źródłowym w wierszu 1. std to przestrzeń nazw, w której string zadeklarowana jest klasa.

W wierszu 11 jest zgłaszany błąd, ponieważ nazwa j nie została zadeklarowana. Deklaracja musi zawierać typ, w przeciwieństwie do innych języków, takich jak JavaScript. W wierszu 12 auto jest używane słowo kluczowe, które nakazuje kompilatorowi wnioskowanie typu k na podstawie wartości, z którą został zainicjowany. W tym przypadku kompilator wybiera int typ.

Zakres deklaracji

Nazwa wprowadzona przez deklarację jest prawidłowa w zakresie , w którym występuje deklaracja. W poprzednim przykładzie zmienne zadeklarowane wewnątrz main funkcji to zmienne lokalne. Można zadeklarować inną zmienną o nazwie i poza główną, w zakresie globalnym i będzie to oddzielna jednostka. Jednak takie duplikowanie nazw może prowadzić do nieporozumień i błędów programistów i należy unikać. W wierszu 21 klasa C jest zadeklarowana w zakresie przestrzeni nazw N. Użycie przestrzeni nazw pomaga uniknąć kolizji nazw. Większość nazw standardowej biblioteki języka C++ jest zadeklarowana w std przestrzeni nazw. Aby uzyskać więcej informacji na temat interakcji reguł zakresu z deklaracjami, zobacz Zakres.

Definicje

Niektóre jednostki, w tym funkcje, klasy, wyliczenia i zmienne stałe, muszą być zdefiniowane, a także zadeklarowane. Definicja udostępnia kompilatorowi wszystkie informacje potrzebne do wygenerowania kodu maszynowego, gdy jednostka jest używana w dalszej części programu. W poprzednim przykładzie wiersz 3 zawiera deklarację funkcji, ale definicja funkcji f jest podana w wierszach od 15 do 18. W wierszu 21 klasa C jest zadeklarowana i zdefiniowana (chociaż zgodnie z definicją klasa nic nie robi). Zmienna stała musi być zdefiniowana, innymi słowy, przypisana wartość w tej samej instrukcji, w której jest zadeklarowana. Deklaracja typu wbudowanego, takiego jak int , jest automatycznie definicją, ponieważ kompilator wie, ile miejsca do przydzielenia.

W poniższym przykładzie przedstawiono deklaracje, które są również definicjami:

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

Poniżej przedstawiono niektóre deklaracje, które nie są definicjami:

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

Definicje typów i instrukcje using

W starszych wersjach języka C++słowo typedef kluczowe jest używane do deklarowania nowej nazwy, która jest aliasemdla innej nazwy. Na przykład typ std::string to inna nazwa dla .std::basic_string<char> Powinno być oczywiste, dlaczego programiści używają nazwy typedef, a nie rzeczywistej nazwy. We współczesnym języku C++ using słowo kluczowe jest preferowane przez typedefelement , ale idea jest taka sama: nowa nazwa jest zadeklarowana dla jednostki, która jest już zadeklarowana i zdefiniowana.

Statyczne składowe klasy

Statyczne składowe danych klasy są zmiennymi dyskretnymi, które są współużytkowane przez wszystkie obiekty klasy. Ponieważ są one współużytkowane, należy je zdefiniować i zainicjować poza definicją klasy. Aby uzyskać więcej informacji, zobacz Klasy.

deklaracje extern

Program C++ może zawierać więcej niż jedną jednostkę kompilacji. Aby zadeklarować jednostkę zdefiniowaną w oddzielnej jednostce kompilacji, użyj słowa kluczowego extern . Informacje w deklaracji są wystarczające dla kompilatora. Jeśli jednak nie można odnaleźć definicji jednostki w kroku łączenia, konsolidator zgłosi błąd.

W tej sekcji

Klasy magazynu
const
constexpr
extern
Inicjatory
Aliasy i definicje typów
using Deklaracji
volatile
decltype
Atrybuty w języku C++

Zobacz też

Podstawowe pojęcia