Der implizit-definierte Kopierkonstruktor in C++ (Der implizit-definierte Kopierkonstruktor in C++), Lektion, Seite 723668
https://www.purl.org/stefan_ram/pub/impliziter_kopierkonstruktor_c++ (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C++-Kurs

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

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723668 stefan_ram:723668 Der implizit-definierte Kopierkonstruktor in C++ Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723668, slrprddef723668, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/impliziter_kopierkonstruktor_c++