const-Exemplare in C++
Ein mit »const« deklariertes Exemplar einer Klasse (Objekt einer Klasse) ist konstant. Es kann nach der Initialisierung nicht verändert werden.
Funktionen konstanter Exemplare
Im folgenden Programm wird durch »s.find( 'b' )« die Position des »b« in »abc« ausgedrückt und dann mit »s.push_back( 'd' )« noch ein »d« an »abc« angefügt.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ ::std::string s = "abc";
::std::cout << s.find( 'b' ) << '\n';
s.push_back( 'd' );
::std::cout << s << '\n'; }- Protokoll
1
abcd
Im folgenden Programm wurde das Objekt »s« als »const« deklariert. Danach ist der Aufruf »s.push_back( 'd' );« nicht mehr erlaubt.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ ::std::string const s = "abc";
::std::cout << s.find( 'b' ) << '\n';
s.push_back( 'd' );
::std::cout << s << '\n'; }- Protokoll (frei übersetzt)
Fehler: const string ist kein zulaessiges Zielobjekt bei 'push_back'.
Die folgende Dokumentation zeigt, daß »find« eine const-Funktion ist, während »push_back« keine const-Funktion ist.
- Dokumentation (vereinfacht, gekürzter Auszug)
namespace std
{ using string = basic_string< char >;template< class charT >
class basic_string
{ size_type find( charT c ) const;
void push_back( charT c ); }}
Nur die const-Funktionen eines const-Objekts dürfen aufgerufen werden. Das sind Funktionen, die das Objekt nicht verändern können.
Felder konstanter Exemplare
In dem folgenden Programm wird etwas in die Felder eines Objekts geschrieben.
main.cpp
#include <initializer_list>
#include <ostream>
#include <iostream>
#include <utility> /* ::std::pair */int main()
{ auto p { ::std::make_pair( 3, 4 ) };p.first = 7;
p.second = 2;::std::cout << p.first << '\n';
::std::cout << p.second << '\n'; }- Protokoll
7
2
Das folgende Programm zeigt, daß Felder konstanter Objekte nicht verändert werden dürfen.
main.cpp
#include <initializer_list>
#include <ostream>
#include <iostream>
#include <utility> /* ::std::pair */int main()
{ auto const p { ::std::make_pair( 3, 4 ) };p.first = 7;
p.second = 2;::std::cout << p.first << '\n';
::std::cout << p.second << '\n'; }- Protokoll
Fehler: Veraenderungen eines Feldes eines konstanten Objekts sind nicht zulaessig.