Udostępnij za pośrednictwem


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łówkowym string , 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 aliasem dla 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 tym obszarze

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

Zobacz też

Podstawowe pojęcia