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 typedef
element , 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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla