Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 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 tym obszarze
Klasy magazynu
const
constexpr
extern
Inicjatory
Aliasy i definicje typów
using
deklaracja
volatile
decltype
Atrybuty w języku C++