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 stringsouboru 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é

Základní koncepty