Anhang D. Implizit erzeugte Methoden und Operatoren

Der C++11-Compiler generiert bei Bedarf viele spezielle Methoden und Operatoren. Während die Operatoren implizit erzeugt werden, können die Methoden vom Compiler auch explizit angefordert werden. Zuerst sehen Sie die speziellen Methoden anhand der Klasse MyData:

struct MyData{
    MyData()= default;
    MyData(const MyData& rhs)= default;
    MyData& operator=(const MyData& rhs)= default;
    ~MyData()= default;
};
Listing D.1 MyData mit vom Compiler erzeugten Standardimplementierungen
Tabelle D.1 Automatisch vom Compiler erzeugte Methoden

Methode

Implementierung

Standard-konstruktor

MyData()= default;

Kopierkonstruktor

MyData(const MyData& rhs)= default;

Zuweisungsoperator

MyData& operator=(const MyData& rhs)= default;

Destruktor

~MyData()= default;

Implizit erzeugte Operatoren

Es folgen die automatisch vom Compiler erzeugten Operatoren für die Klasse MyData. Um das Beispiel möglichst übersichtlich zu halten, verzichte ich auf die implizit erzeugten Methoden aus Listing D.1. Lediglich eine Variable data vom Typ int ist notwendig.

operatorImplicit.cpp

01 #include <iostream>
02
03 struct MyData{
04   int data;
05 };
06
07 int main(){
08   std::cout << std::endl;
09
10   // for new
11   MyData* pMD= new MyData;
12   MyData mD;
13
14   // for &
15   MyData* pMD2= &mD;
16
17   // for *
18   MyData mD2= *pMD2;
19
20   // for ->
21   pMD->data=15;
22   std::cout <<"Value of data= " << pMD->data << std::endl;
23
24   // for ->*
25   int MyData::*pmd = &MyData::data;
26   pMD->*pmd = 20;
27   std::cout <<"Value of data= " << (pMD->*pmd) << std::endl;
28
29   // for delete
30   delete pMD;
31
32   std::cout << std::endl;
33
34 }
Listing D.2 Implizit erzeugte Operatoren für MyData

Die kleine Demonstration der automatisch erzeugten Operatoren der C++-Laufzeit gibt die beiden Werte in Abbildung D.1 aus.

Implizit erzeugte Operatoren im Einsatz

In Tabelle D.2 sind die implizit vom Compiler erzeugten Operatoren zusammengefasst.

Tabelle D.2 Implizit vom Compiler erzeugte Operatoren

Name

Syntax

Beispiel

operator new

new

MyData* pMD= new MyData ;

operator delete

delete

delete pMD;

Adresse von

&

&mD;

Indirektion

*

*pmD2;

Element Zugriff

pMD->data=15;

Element Indirektion

→*

pMD->*pmd = 10;

Von C++11 implizit erzeugte Methoden

Das ist aber nicht die ganze Geschichte. C++11 bringt die zwei neuen Konstruktoren automatisch mit: den Move-Konstruktor und den Move-Zuweisungsoperator, bei dem die Ressource verschoben wird. Die Standardimplementierungen lassen sich auf die bekannte Art nutzen.

struct MyData{
  MyData(MyData&& rhs)= default;
  MyData& operator=(MyData&& rhs)= default;
};
Listing D.3 Von C++11 implizit erzeugte Methoden

Tabelle D.1 muss um die zwei Methoden in Tabelle D.3 erweitert werden.

Tabelle D.3 Implizite Move-Konstruktoren mit C++11

Methode

Implementierung

Move-Konstruktor

MyData(MyData&& rhs)= default;

Move-Zuweisungsoperator

MyData& operator=(MyData&& rhs)= default;