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; };
Methode | Implementierung |
Standard-konstruktor |
|
Kopierkonstruktor |
|
Zuweisungsoperator |
|
Destruktor |
|
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 }
Die kleine Demonstration der automatisch erzeugten Operatoren der C++-Laufzeit gibt die beiden Werte in Abbildung D.1 aus.
In Tabelle D.2 sind die implizit vom Compiler erzeugten Operatoren zusammengefasst.
Name | Syntax | Beispiel |
operator new | new |
|
operator delete | delete |
|
Adresse von | & |
|
Indirektion | * |
|
Element Zugriff | → |
|
Element Indirektion | →* |
|
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; };
Tabelle D.1 muss um die zwei Methoden in Tabelle D.3 erweitert werden.