Der implizit definierte Kopierkonstruktor in C++
Es ist möglich, ein Exemplar unserer Klasse zu initialisieren, indem wir seinen Inhalt von einem anderen Objekt derselben Klasse kopieren.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
struct entity { ::std::string string; };
int main()
{ ::entity const entity{ "abc"s }; /* <-- Aggregatinitialisierung */
::std::cout << entity.string << '\n';/* Direkt-Listen-Initialisierung
(in diesem Fall unter Heranziehung des Kopierkonstruktors) --> */::entity const copied{ entity };
::std::cout << copied.string << '\n'; }
transcript
abc
abc- Aussprachehinweis
- copied ˈkɑːpid (d)
Dafür benötigt unsere Klasse einen Kopierkonstruktor.
Wir haben für unsere Klasse keine ausdrückliche (explizite) Definition eines Kopierkonstruktors angegeben.
Wird für eine Klasse kein Konstruktor explizit definiert, so wird stillschweigend (implizit) ein Kopierkonstruktor zur Klasse hinzugefügt.
- Die Proklamationen der implizit definierten Konstruktoren
entity();
entity( const entity & x );
Jener implizit definierte Kopierkonstruktor ermöglicht es uns, im obigen Programm eine Direkt-Listen-Initialisierung unter Heranziehung des Kopierkonstruktors durchführen zu können, obwohl wir gar keinen Kopierkonstruktor definiert haben.
Jener implizit definierte Kopierkonstruktor kopiert die einzelnen Felder eines Klassenobjektes.
Vorgaben
Funktionen, die unter Umständen vorgegeben (von der Implementation definiert) werden, werden als „spezielle Elemente“ bezeichnet.
Wenn der Benutzer selber keine speziellen Elemente deklariert, werden der Fehlkonstruktur und der Kopierkonstruktor von der Implementation vorgegeben.
Deklariert der Benutzer selber einen Fehlkonstruktor (wir werden dies erst später tun), so wird weiterhin ein Kopierkonstruktor vorgegeben.
Deklariert der Benutzer selber einen Kopierkonstruktor (wir werden dies erst später tun), so wird kein Fehlkonstruktor mehr vorgegeben.
Deklariert der Benutzer einen anderen Konstruktor (was wir erst später tun werden), so wird kein Fehlkonstruktor mehr vorgegeben, aber weiterhin ein Kopierkonstruktor.
- Tabelle
.- Benutzer Fehl- Kopier-
| deklariert: konstruktor konstruktor
|
|
|
| nichts vorgegeben vorgegeben
|
| Fehl- benutzer- vorgegeben
| konstruktor deklariert
|
| Kopier- nicht benutzer-
| konstruktor deklariert deklariert
|
| anderen nicht vorgegeben
| Konstruktor deklariert
|
'-
Zitate
- Die einzelnen Felder werden jeweils einzeln kopiert
- “The implicitly-defined copy/move constructor for a non-union class X performs a memberwise copy/move of its bases and members. ”, 2015 15.8.1p14