Nicht-statische Funktionseinträge in C++
Die Definitionen der in der vorigen Lektion behandelten Funktionen für Objekte der Klasse »::pair« können auch in den Klassenspezifizierer geschrieben werden.
Da diese Funktionen hauptsächlich für Objekte der Klasse »::pair« gedacht sind, ist es sinnvoll, ihre Zugehörigkeit zu jener Klasse zum Ausdruck zu bringen. Dazu können sie direkt in den Klassenspezifizierer geschrieben werden.
main.cpp
#include <iostream>
#include <ostream>struct pair
{ double x;
double y;void set
( ::pair & p,
double const x,
double const y )
{ p.x = x;
p.y = y; }void add
( ::pair & p,
::pair const & q )
{ p.x += q.x;
p.y += q.y; }pair sum
( ::pair p,
::pair const & q )
{ p.::pair::add( p, q );
return p; }void print
( pair const & p )
{ ::std::cout << p.::pair::x << '\n';
::std::cout << p.::pair::y << '\n'; }};int main()
{ ::pair p;
::pair q;
p.::pair::set( p, 2, 3 );
p.::pair::set( q, 1, 4 );
p.::pair::print( p.::pair::sum( p, q )); }::std::cout
3
7
Die wie oben im Klassenspezifizierer definierten Funktionen nennen wir auch nicht-statische Funktionseinträge der Klasse (kurz auch: nicht-statische Funktionen ). Es handelt sich dabei um Funktionen, welche direkt im Klassenspezifizierer deklariert und nicht mit dem Schlüsselwort »static« gekennzeichnet sind. Solche Funktionen gelten als Bestandteil jedes Objektes ihrer Klasse.
Um solch eine nicht-statische Funktion aufzurufen, muß ein Objekt jener Klasse und ein Punkt ».« vor die Angabe der Funktion geschrieben werden. Dies kann man in dem obigen Programm sehen, beispielsweise im Ausdruck »p.::pair::add( p, q )«. In dem obigen Programmbeispiel ist es egal, ob wir »p« oder »q« vor den Punkt schreiben. Hauptsache dort steht ein Objekt der Klasse, zu welcher die nicht-statischen Funktionen gehören. Jenes Objekt der Klasse, zu welcher die nicht-statischen Funktionen gehören, nennen wir auch das Zielobjekt des Aufrufs.
Dasselbe Programm ohne vollständig-qualifizierte Bezeichner:
main.cpp
#include <iostream>
#include <ostream>struct pair
{ double x;
double y;void set
( pair & p,
double const x,
double const y )
{ p.x = x;
p.y = y; }void add
( pair & p,
pair const & q )
{ p.x += q.x;
p.y += q.y; }pair sum
( pair p,
pair const & q )
{ p.add( p, q );
return p; }void print
( pair const & p )
{ ::std::cout << p.x << '\n';
::std::cout << p.y << '\n'; }};int main()
{ pair p;
pair q;
p.set( p, 2, 3 );
p.set( q, 1, 4 );
p.print( p.sum( p, q )); }::std::cout
3
7
Wir werden im weiteren Verlauf des Kurses die Schreibweise ohne vollständig-qualifizierte Bezeichner bevorzugen.
Semikolons
Funktionsdefinitionen in einem Klassenspezifizierer werden, anders als bei Felddefinitionen, nicht mit einem Semikolon abgeschlossen.
- C++ 2015 (vereinfacht)
- 〈 member-declaration 〉 ::=
- [〈 attribute-specifier-seq 〉] [〈 decl-specifier-seq 〉] [〈 member-declarator-list 〉] ';' |
- 〈 function-definition 〉.
Hinter dem Klassenspezifizierer selber steht weiterhin ein Semikolon (damit aus dem Klassenspezifizierer eine Deklaration wird).
- C++ 2015 (vereinfacht)
- 〈 declaration 〉 ::=
- 〈 class-specifier 〉 ';'.