const (C++)

Když upraví deklaraci dat, klíčové slovo určuje, const že objekt nebo proměnná není možné upravit.

Syntaxe

declarator:
ptr-declarator
noptr-declarator parameters-and-qualifiers trailing-return-type
ptr-declarator:
noptr-declarator
ptr-operator ptr-declarator
noptr-declarator:
declarator-idattribute-specifier-seqRozhodnout
noptr-declarator parameters-and-qualifiers
noptr-declarator[constant-expressionopt opt]attribute-specifier-seq
( ptr-declarator )
parameters-and-qualifiers:
(parameter-declaration-clause)cv-qualifier-seqRozhodnout
ref-qualifieroptnoexcept-specifieroptattribute-specifier-seq
trailing-return-type:
-> type-id
ptr-operator:
*attribute-specifier-seqopt optcv-qualifier-seq
&attribute-specifier-seqRozhodnout
&&attribute-specifier-seqRozhodnout
nested-name-specifier*attribute-specifier-seqopt optcv-qualifier-seq
cv-qualifier-seq:
cv-qualifiercv-qualifier-seqRozhodnout
cv-qualifier:
const
volatile
ref-qualifier:
&
&&
declarator-id:
...Rozhodnoutid-expression

const Hodnoty

Klíčové const slovo určuje, že hodnota proměnné je konstantní a říká kompilátoru, aby zabránil programátorovi v jeho úpravě.

// constant_values1.cpp
int main() {
   const int i = 5;
   i = 10;   // C3892
   i++;   // C2105
}

V jazyce C++ můžete místo direktivy preprocesoru const použít klíčové slovo #define k definování konstantních hodnot. Hodnoty definované const pomocí kontroly typů se dají použít místo konstantních výrazů. V jazyce C++ můžete zadat velikost pole s proměnnou const následujícím způsobem:

// constant_values2.cpp
// compile with: /c
const int maxarray = 255;
char store_char[maxarray];  // allowed in C++; not allowed in C

V jazyce C směřují výchozí hodnoty konstant na externí propojení tak, aby se mohly zobrazit pouze ve zdrojových souborech. V jazyce C++ směřují výchozí hodnoty konstant na vnitřní propojení tak, aby se mohly zobrazit pouze v rámci souborů hlaviček.

Klíčové const slovo lze použít také v deklaracích ukazatelů.

// constant_values3.cpp
int main() {
   char this_char{'a'}, that_char{'b'};
   char *mybuf = &this_char, *yourbuf = &that_char;
   char *const aptr = mybuf;
   *aptr = 'c';   // OK
   aptr = yourbuf;   // C3892
}

Ukazatel na proměnnou deklarovanou jako const lze přiřadit pouze ukazateli, který je také deklarován jako const.

// constant_values4.cpp
#include <stdio.h>
int main() {
   const char *mybuf = "test";
   char *yourbuf = "test2";
   printf_s("%s\n", mybuf);

   const char *bptr = mybuf;   // Pointer to constant data
   printf_s("%s\n", bptr);

   // *bptr = 'a';   // Error
}

Ukazatele na data konstanty lze použít jako parametry funkce pro zabránění úpravy parametru předaného prostřednictvím ukazatele.

Pro objekty, které jsou deklarovány jako const, můžete volat pouze konstantní členské funkce. Kompilátor zajišťuje, že konstantní objekt není nikdy změněn.

birthday.getMonth();    // Okay
birthday.setMonth( 4 ); // Error

Pro objekt, který není konstantní, můžete volat konstantní nebo nekontinutní členské funkce. Členovou funkci můžete také přetížit pomocí klíčového const slova. Tato funkce umožňuje volat jinou verzi funkce pro konstantní a ne constantní objekty.

Pomocí klíčového const slova nelze deklarovat konstruktory ani destruktory.

const členské funkce

Deklarování členské funkce pomocí klíčového const slova určuje, že tato funkce je "jen pro čtení", která neupravuje objekt, pro který je volána. Konstantní členová funkce nemůže upravovat žádné nestatické datové členy ani volat žádné členské funkce, které nejsou konstantní. Chcete-li deklarovat konstantní členovou funkci, umístěte const klíčové slovo za pravou závorku seznamu argumentů. Klíčové const slovo je vyžadováno v deklaraci i definici.

// constant_member_function.cpp
class Date
{
public:
   Date( int mn, int dy, int yr );
   int getMonth() const;     // A read-only function
   void setMonth( int mn );   // A write function; can't be const
private:
   int month;
};

int Date::getMonth() const
{
   return month;        // Doesn't modify anything
}
void Date::setMonth( int mn )
{
   month = mn;          // Modifies data member
}
int main()
{
   Date MyDate( 7, 4, 1998 );
   const Date BirthDate( 1, 18, 1953 );
   MyDate.setMonth( 4 );    // Okay
   BirthDate.getMonth();    // Okay
   BirthDate.setMonth( 4 ); // C2662 Error
}

Rozdíly v jazyce C a C++ const

Když definujete proměnnou const v souboru zdrojového kódu jazyka C, provedete to takto:

const int i = 2;

Následně je možné tuto proměnnou použít v jiném modulu takto:

extern const int i;

Pokud ale chcete získat stejné chování v jazyce C++, musíte definovat proměnnou const takto:

extern const int i = 2;

Podobně jako v jazyce C můžete tuto proměnnou použít v jiném modulu následujícím způsobem:

extern const int i;

Pokud chcete definovat proměnnou extern v souboru zdrojového kódu C++ pro použití v souboru zdrojového kódu jazyka C, použijte:

extern "C" const int x=10;

pro zabránění v úpravě názvu kompilátorem jazyka C++.

Poznámky

Při sledování seznamu parametrů členské funkce určuje klíčové slovo, že funkce neupravuje objekt, const pro který je vyvolán.

Další informace najdete constv následujících článcích:

Viz také

Klíčová slova