Deklarace a definice (C++)
Program C++ se skládá z různých entit, jako jsou proměnné, funkce, typy a obory názvů. Každá z těchto entit musí být deklarována , aby bylo možné je použít. Deklarace určuje jedinečný název entity spolu s informacemi o jeho typu a dalších vlastnostech. V jazyce C++ je bod, ve kterém je název deklarován, bodem, ve kterém se stane viditelným kompilátorem. V kompilační jednotce nemůžete odkazovat na funkci nebo třídu deklarovanou později. Proměnné by měly být deklarovány co nejblíže před tím, než se použijí.
Následující příklad ukazuje některé deklarace:
#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{/*...*/};
}
Na řádku 5 je funkce main
deklarována. Na řádku 7 se deklaruje pi
a inicializuje proměnnáconst
. Na řádku 8 je celé číslo i
deklarováno a inicializováno s hodnotou vytvořenou funkcí f
. Název f
je viditelný kompilátoru z důvodu předaného deklarace na řádku 3.
Na řádku 9 je deklarována proměnná s názvem obj
typu C
. Tato deklarace však vyvolá chybu, protože C
není deklarována až později v programu a není deklarována dopředu. Pokud chcete chybu opravit, můžete buď přesunout celou definiciC
před main
, nebo pro ni přidat deklaraci vpřed. Toto chování se liší od jiných jazyků, jako je C#. V těchto jazycích lze funkce a třídy použít před jejich bodem deklarace ve zdrojovém souboru.
Na řádku 10 je deklarována proměnná s názvem str
typu std::string
. Název std::string
je viditelný, protože je zavedený v string
souboru záhlaví, který se sloučí do zdrojového souboru na řádku 1. std
je obor názvů, ve kterém string
je třída deklarována.
Na řádku 11 se vyvolá chyba, protože název j
nebyl deklarován. Deklarace musí obsahovat typ, na rozdíl od jiných jazyků, jako je JavaScript. Na řádku 12 auto
se používá klíčové slovo, které kompilátoru říká, aby odvodil typ k
na základě hodnoty, se kterou je inicializován. Kompilátor v tomto případě zvolí int
typ.
Rozsah deklarace
Název zavedený deklarací je platný v oboru, ve kterém k deklaraci dochází. V předchozím příkladu jsou proměnné deklarované uvnitř main
funkce místní proměnné. Můžete deklarovat jinou proměnnou s názvem i
mimo hlavní obor v globálním oboru a to by byla samostatná entita. Takové duplikování názvů však může vést k nejasnostem a chybám programátora a mělo by se jim vyhnout. V řádku 21 je třída C
deklarována v oboru názvů N
. Použití oborů názvů pomáhá vyhnout se kolizím názvů. Většina názvů standardní knihovny C++ je deklarována v rámci std
oboru názvů. Další informace o interakci pravidel oboru s deklaracemi naleznete v tématu Obor.
Definice
Některé entity, včetně funkcí, tříd, výčtů a konstantních proměnných, musí být definovány a deklarovány. Definice poskytuje kompilátoru všechny informace, které potřebuje k vygenerování strojového kódu při pozdějším použití entity v programu. V předchozím příkladu obsahuje řádek 3 deklaraci funkce f
, ale definice funkce je k dispozici v řádcích 15 až 18. Na řádku 21 je třída C
deklarována i definována (i když jak je definována třída nedělá nic). Konstantní proměnná musí být definována jinými slovy přiřazenou hodnotou ve stejném příkazu, ve kterém je deklarována. Deklarace předdefinovaného typu, jako int
je například automaticky definice, protože kompilátor ví, kolik místa pro něj má přidělit.
Následující příklad ukazuje deklarace, které jsou také definice:
// 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;
};
Tady je několik deklarací, které nejsou definicemi:
extern int i;
char *strchr( const char *Str, const char Target );
Typedefs a using – příkazy
Ve starších verzích jazyka C++ typedef
se klíčové slovo používá k deklaraci nového názvu, který je aliasem pro jiný název. Například typ std::string
je jiný název .std::basic_string<char>
Je zřejmé, proč programátoři používají název typedef, nikoli skutečný název. V moderním jazyce C++ using
je klíčové slovo upřednostňované před typedef
, ale myšlenka je stejná: nový název je deklarován pro entitu, která je již deklarována a definována.
Statické členy třídy
Datové členy statické třídy jsou diskrétní proměnné, které jsou sdíleny všemi objekty třídy. Protože jsou sdílené, musí být definovány a inicializovány mimo definici třídy. Další informace naleznete v tématu Třídy.
extern deklarace
Program C++ může obsahovat více než jednu kompilační jednotku. Chcete-li deklarovat entitu definovanou v samostatné jednotce kompilace, použijte extern
klíčové slovo. Informace v deklaraci jsou dostatečné pro kompilátor. Pokud se ale v kroku propojení nenajde definice entity, vyvolá linker chybu.
V této části
Třídy úložiště
const
constexpr
extern
Inicializátory
Aliasy a definice Typedef
using
Prohlášení
volatile
decltype
Atributy v jazyce C++
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro