Kopierinitialisierung in C++ (Kopierinitialisierung in C++), Lektion, Seite 721551
https://www.purl.org/stefan_ram/pub/kopierinitialisierung_c++ (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C++-Kurs

Kopierinitialisierung in C++ 

Kopierinitialisierung in Deklaration bei Typgleichheit

Das folgende Programm zeigt eine Kopierinitialisierung  in einer Variablendefinition.

main.cpp

#include <iostream> /* ::std::cout */
#include <ostream> /* << */
#include <string> /* ::std::string */

using namespace ::std::literals;

int main()
{ ::std::string const a{ "alpha"s };
::std::string const b = a;
::std::cout << a << '\n';
::std::cout << b << '\n'; }

transcript
alpha
alpha

Die Initialisierung von »b« mit »a« in »::std::string const b = a;« wird Kopierinitialisierung genannt, weil sie mit einem Gleichheitszeichen »=« geschrieben ist. Man beachte, daß es sich hierbei nicht  um eine Zuweisung handelt!

(Die Schreibweise der Initialisierung mit geschweiften Klammern hilft auch dabei, den in C++  wichtigen Unterschied zwischen Initialisierung  und Zuweisung  zu verdeutlichen.)

C++ 2015 8.5p15
The initialization that occurs in the = form of a brace-or-equal-initializer or condition (6.4), as well as in argument passing, function return, throwing an exception (15.1), handling an exception (15.3), and aggregate member initialization (8.5.1), is called copy-initialization. [ Note: Copy-initialization may invoke a move (12.8). —end note ]

Der Ausdruck »a« hat denselben Typ wie die neue Variable »b«, so daß der Wert von »a« (ein ::std::string-Exemplar) direkt nach »b« kopiert  werden kann. Es gibt danach also zwei verschiedene  ::std::string-Exemplare, nämlich »a« und »b« und beide enthalten jeweils eine eigene Kopie des Textes »alpha«.

Durch eine Veränderung der Variablen, können wir sehen, daß sie wirklich zwei verschiedene  Kopien desselben Textes enthalten.

main.cpp

#include <iostream> /* ::std::cout */
#include <ostream> /* << */
#include <string> /* ::std::string */

using namespace ::std::literals;

int main()
{ ::std::string a{ "alpha"s };
::std::string b = a;
a.push_back( '0' );
b.push_back( '1' );
::std::cout << a << '\n';
::std::cout << b << '\n'; }

transcript
alpha0
alpha1

Eine Erzeugung eines neuen Exemplars aus einem anderen Exemplar desselben Typs wird Kopierkonstruktion  genannt. In dem Fall, daß der Initialisierungsausdruck denselben Typ wie das zu initialisierende Objekt hat, ist die Kopierinitialisierung also eine reine Kopierkonstruktion.

Kopierinitialisierung ohne Typwandlung

Wenn der Typ des Initialisierungsausdrucks dem Typ des deklarierten Objekts gleicht, dann wird der Wert des Initialisierungsausdrucks einfach unter Heranziehung des Kopierkonstruktors in das neue Objekt kopiert.

main.cpp

#include <iostream> /* ::std::cout */
#include <ostream> /* << */

int main()
{ double const x = 2.3;
::std::cout << x << '\n'; }

Protokoll
2.3
main.cpp

#include <iostream> /* ::std::cout */
#include <ostream> /* << */
#include <string>

using namespace ::std::literals;

int main()
{ ::std::string const s = "abc"s;
::std::cout << s << '\n'; }

Protokoll
abc

Kopierinitialisierung bei Deklaration mit impliziter Typwandlung

Bei der Kopierinitialisierung ist es ebenfalls möglich, einen Initialisierungsausdruck eines Typs (des Quelltyps) zu verwenden, der sich vom Typ des zu initialisierenden Objektes (dem Zieltyp) unterscheidet. In diesem Fall wird vorausgesetzt, daß es eine Möglichkeit der Wandlung  des Initialisierungsausdrucks in den Zieltyp gibt.

Wir können solch eine implizite Typwandlung  bereits mit den fundamentalen Datentypen des Grundkurses illustrieren:

main.cpp

#include <iostream> /* ::std::cout */
#include <ostream> /* << */

int main()
{ double const x = 2;
::std::cout << x << '\n'; }

transcript
2

Hier wird der int-Wert »2« zunächst in den double-Wert »2.0« gewandelt und dann in das Objekt »x« gespeichert.

Wir haben eine Art von „Wandlungsmöglichkeit“ in Lektion 28.4. kennengelernt: Eine char-*-Zeichenfolge kann in eine ::std::string-Zeichenfolge gewandelt werden.

Hiervon wird in dem folgenden Programm Gebrauch gemacht. Es verwendet eine Kopierinitialisierung mit einem Gleichheitszeichen »=«, obwohl die rechte Seite gar nicht den Typ der linken Seite hat. Die Programmiersprache verwendet aber zunächst die Typwandlungsmöglichkeit, welche durch den Wandlungskonstruktor der Klasse »::std::string« gegeben ist.

Das folgende Programm zeigt eine Kopierinitialisierung mit impliziter Typwandlung.

main.cpp

#include <iostream> /* ::std::cout */
#include <ostream> /* << */
#include <string> /* ::std::string */

int main()
{ ::std::string const b = "beta";
::std::cout << b << '\n'; }

::std::cout
beta

Bei der Kopierinitialisierung wird die Zeichenfolge »beta« erst einmal in ein ::std::string-Exemplar konvertiert, das dann nach »b« kopiert wird. Also ähnlich wie in dem folgenden Programm.

main.cpp

#include <iostream> /* ::std::cout */
#include <ostream> /* << */
#include <string> /* ::std::string */

int main()
{ ::std::string const b = static_cast< ::std::string >( "beta" );
::std::cout << b << '\n'; }

Protokoll
beta

Beziehungsweise wie in:

main.cpp

#include <iostream> /* ::std::cout */
#include <ostream> /* << */
#include <string> /* ::std::string */

int main()
{ ::std::string const b { static_cast< ::std::string >( "beta" ) };
::std::cout << b << '\n'; }

Protokoll
beta

Eine Kopierinitialisierung mit impliziter Typwandlung umfaßt im allgemeinen zwei Schritte:

1.) der Wert des Initialisierungsausdrucks wird implizit in den Typ des zu initialisierenden Objektes gewandelt (beispielsweise mit einem Wandlungskonstruktor),

2.) der im vorigen Schritt erhaltene Wert wird mit einem Kopierkonstruktor in das zu initialisierende Objekt kopiert.

Zur Durchführung der Kopierinitialisierung  wird also immer  der Kopierkonstruktor  herangezogen, und bevor dies geschieht, könnten noch Typwandlungen durchgeführt werden. (Es ist möglich, daß eine Implementation zur Beschleunigung des Programmablaufs den Kopierkonstruktor nicht wirklich aufruft, aber selbst dann muß er wenigstens vorhanden sein.)

Das folgende Programm zeigt die uns bekannten Möglichkeiten der Initialisierung eines Objektes.

main.cpp

#include <iostream>
#include <ostream>
#include <string>

using namespace ::std::literals;

void p( ::std::string const s ) { ::std::cout << s << '\n'; }

int main ()
{ { ::std::string const s { "1"s }; p( s ); } /* Geschweifte-Klammer-Initialisierung */
{ ::std::string const s { "2" }; p( s ); } /* Geschweifte-Klammer-Initialisierung */
{ ::std::string const s = "3"s; p( s ); } /* Kopierinitialisierung ohne Wandlung */
{ ::std::string const s = "4"; p( s ); }} /* Kopierinitialisierung mit Wandlung */

transcript
1
2
3
4

»auto« schützt vor unabsichtlicher Typwandlung

Bei Ausführung der Deklaration »::std::string s = "4";« wird »"4"« zuerst in ein ::std::string-Objekt gewandelt, und anschließend wird dieses Objekt in ein anderes ::std::string-Objekt kopiert. Dies hat damit zu tun, daß der Typ des Initialisierungsausdrucks nicht dem Typ des zu initialisierenden Objektes gleicht. Durch die Verwendung von »auto« werden solche umständlichen Zwei-Schritt-Initialisierungen stets vermieden:

main.cpp

#include <iostream>
#include <ostream>
#include <string>

using namespace ::std::literals;

void p( ::std::string const s ) { ::std::cout << s << '\n'; }

int main ()
{ { auto const s { "1"s }; p( s ); } /* Geschweifte-Klammer-Initialisierung */
{ auto const s { "2" }; p( s ); } /* Geschweifte-Klammer-Initialisierung */
{ auto const s = "3"s; p( s ); } /* Kopierinitialisierung ohne Wandlung */
{ auto const s = "4"; p( s ); }} /* Kopierinitialisierung ohne Wandlung */

transcript
1
2
3
4

Allerdings ist der Typ des letzten »s« nun nicht mehr »::std::string«, sondern »char const * const«.

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 stefanram721551 stefan_ram:721551 Kopierinitialisierung in C++ source, source code,sourcecode, Programmier sprache java, Java Programm Java Programmiersprache Java Sprache Java Programmierung Programmieren in Java, Die Programmiersprache Java Javapgrammierung, Java-Programmierung, Java2, Java1.2, Java1.3, Java1.4, Java1.5, Java 2, Java 1.2, Java 1.3, Java 1.4, Java 1.5, Java 1.6, Java 1.7, Java 1.8, Java 8, Java 1.9, Java 9, Java 1.10, Java 10, Tiger, Dolphin, objektorientierte Programmierung, Java sun, , Softwareentwicklung, Software-Entwicklung, Software Entwicklung, Softwareprogrammierung, Software-Programmierung, Software Programmierung, Softwareherstellung, Software-Herstellung, Software Herstellung, Softwareerstellung, Software-Erstellung, Software Erstellung, Softwareengineering, Software-Engineering, Software Engineering, Softwareenginering, Software-Enginering, Software Enginering, Softwaremethodik, Software-Methodik, Software Methodik, Programmiermethodik, Programmier-Methodik, Programmier Methodik, Softwaredidaktik, Software-Didaktik, Software Didaktik, Methodik des Programmierens, Didaktik des Programmierens, Fachdidaktik des Programmierens, Fach-Didaktik des Programmierens, Programmieren, Programmierung, Computer Science, Informatik, Informatik, Informationspädagogik, Informationspaedagogik, Programmierer, programmieren, Quellcode, Quelltext, Quelle, Quellen, Informatiker, Fachinformatiker, Entwickler, mit Stil, mit Stiel, mit Still, , Einführung, Einfuehrung, Einführungen, Einfuehrungen, eLearning-Modul, e-Learning-Modul, eLearning-Module, e-Learning-Module, Kurs Berlin, Kurse Berlin, Kursus, Vortrag, Vorträge, Vortraege, Lehrgang, Lehrgänge, Lehrgaenge, kostenloses Lehrmaterial, kostenlose Lehrmaterialien, Vorlesung, Vorlesungen, Unterrichtseinheit, Unterrichtseinheiten, kostenloses Unterrichtsmaterial im Internet, kostenlose Unterrichtsmaterialien im Internet, Ausbildung, Ausbildungen, für die Ausbildung, Fortbildung, Fortbildungen, Weiterbildung, Weiterbildungen, Schulung Berlin, Schulungen Berlin, Internetschulung, Webschulung, Kursunterlage, Kursunterlagen, trainer Berlin, Didaktik, Informatikunterricht, Primer, Skript FH, Skripte FH, Skriptum FH, Skripts FH, Script FH, Scripte FH, Scriptum FH, Scripts FH, howto, how-to, how to, Lehrbuch, Buch, Bücher, Buecher, Bericht, Crash Kurs Berlin, Crash-Kurs Berlin, Crashkurs Berlin, Report, Sachtext, Sachtexte, Übung, Übungen, Uebung, Uebungen, course, PbclevtugFgrsnaEnz, lecture note, lecture notes, Tutorial, Tutor, Tutorium, Teacher, Lehrer Berlin, Trainer Berlin, Beratung Berlin, Anleitung zum, Anleitungen zum, Einführung, Einfuehrung, Einführungen, Einfuehrungen, Handbuch für, Handbücher, Handbuecher, Support, Diplomarbeit, Facharbeit, Hausarbeit, Hausarbeiten, Werk, Werke, Text, Übungsblatt, Uebungsblatt, Lösung, Loesung, Lösungen, Loesungen, Auflösung, Aufloesung, Auflösungen, Aufloesungen, Facharbeit, Facharbeiten, Forum, Training, manual, Folie, Folien, Lehrmittel, beratung, Definition von, Allgemeine Erklärung, Allgemeine Erklaerung, Allgemeine Erklärungen, Allgemeine Erklaerung, Allgemeine Erklaerungen, Einfache Erklärung einfach, Einfache Erklaerung einfach, Einfache Erklärungen, Einfache Erklaerung, Einfache Erklaerungen, zum Thema, FAQ, FAQs, Konzept, Lernkurs, Lern-Kurs, Lernkurse, Lern-Kurse, eine kurze Erklärung, Begriff, Begriffe, Erklärung zu Begriffen, begriffbestimmung, begriffbestimmung, Begriffsbestimmung, Begriffserklärung, Begriffserklaerung, Wort, Worterklärung, Worterklaerung, Definition, Beispiel, Beispiele, Bedeutung, Bedeutungen, was bedeutet, Begriffsdefinition, für Anfänger, fuer Anfaenger, für Einsteiger, für Beginner, zum selber Lernen, handout, hand out, web based training, WBT, Net Based Training, NBT, computer based training, CBT, virtual learning environment, virtual university, für die Schule, Seminar, Seminare, Vorgehensweise, Pädagogik, Paedagogik, Akademie, Onlineacademie, Onlineakademie, Wissen, Unterrichtsvorbereitung für das Fach, Unterricht, für Lehrer, für Lehrerinnen, Referat, Referate, Hausaufgabe, Hausaufgaben, Tip, Tipp. Tipps und Tricks, Tips und Tricks, Methode, Methoden, Methodik, Funktion, Funktionsweise, Aufbau, Prinzip, Grundlage, Grundlagen, Internetschulung, Unterlage, Unterlagen, Struktur, Frage, Fragen, Antwort, Antworten, Schulunterricht, zum erlernen, was ist das?, wie?, lerne, Onlineausbildung, Onlinelehrgang, Onlinekurs, Onlinebuch, Webbuch, Academy, Fachhochschule, FH, TFH, Hochschule, Universität, Universitaet, Uni, Schule, Berufsschule, Gymnasium, Erste Schritte mit, Dozent, Dozenten, Zusammenfassung, Übersicht, Term, Fachwort, Fachbegriff, Fachbegriffe, Grundbegriff, Grundbegriffe, Lektion, Lektionen, Bedienungsanleitung, Bedienungsanleitungen, Spezialist, Spezialisten, Coaching, Coach, Fachbuch, technologie, Unterschied zwischen, Unterschiede zwischen, lehren, unterrichten, für das Studium, für Studenten, für Studentinnen, für Studierende, für Schüler, für Schülerinnen, Wie kann ich, Wie kann man, Hilfe, selber, erstellen, Erstellung, Beginner, Online-Seminar, Online-Kurs, Online-Schulung, ich, gebrauchsanweisung, gebrauchsanleitung, Bedienungsanweisung, Einweisung, Kurzinfo, Internet-Kurs, Internet-Kurse, Online-Training, Intensiv, Intensivkurs, Vortragsreihe, Präsentation, Grundzüge, Mitschrift, Mitschriften, Verständnis, verstehen, anwenden, Hintergrundwissen, Hintergrund, Hintergründe, content, Funktionsprinzip, Schritt für Schritt; E-Learning; elearning; online learning; Fernlehre, Fernlehrgang, Fernlehrgänge, Referent, Referenten, Fernkurs, Fernkurse, Fernstudium, Fernschule, Fernuniversität, Fernlehrer, Denken, Qualifizierungsmaßnahme, Qualifizierung, Qualifizierungen, Volkshochschulkurs, Volkshochschulkurse, Internet-Learning-Plattform, Online-Learning-Plattform, E-Learning-Plattform, Internetlearning-Plattform, Onlinelearning-Plattform, Elearning-Plattform, jetzt, Kochbuch, einfach erklärt, Kenntnis, Kenntniss, Kenntnisse, deutsche Hilfe, lernen und verstehen; blended learning; courseware, Profi, Profis, professionell, professionelle, professionelles, profesionell, profesionelle, profesionelles, professionel, gekonnt, für Könner, Grundkurs, Leistungskurs, Aufbaukurs, Lehrtext, Lehrtexte, Fachtext, Fachtexte, Ausarbeitung, distance learning, Online Seminar, distance education, Online Tutorium, Online Tutorien, technology-based learning, Computer based learning, CBL, Internet Based learning, IBL, Web based learning, WBL, online-learning, OL, online-training, OT, CAI, Computer Assisted Instruction, CUU, Computerunterstützter Unterricht, Computer-unterstützter Unterricht, Know how, Grundkenntnis, Grundkenntnisse, Kompetenz, Schulungsunterlagen, Insiderwissen, Rat, Lehrerinnen und Lehrer, ABC, Überblick, Arbeitsblatt, Sekundarstufe, Oberstufe, Material, Materialien, Unterrichtsentwurf, Unterrichtsentwürfe, Lerntip, Lerntips, Lerntipp, Lerntipps, ebook, schnell lernen, Lerner, Lernender, Lernende Erwachsenenbildung, Frage und Antwort, Selbststudium, Selbstudium, Umschulung, , kostenlos, kostenlose, kostenloses, kosten los, kosten lose, kosten loses, gratis, free, frei, freie, freies, privat, private, privates, homepage, home-page, home page, website, web site, webpage, web-page, web page, webpages, web-pages, web pages, webseite, Web-Seite, Webseite, Webseiten, Web-Artikel, Web Artikel, online, on-line, on line, download downloaden, down load, or, deutsch, deutsche, deutsches, deutscher, Deutschland, deutschsprachig, deutschsprachige, deutschsprachiges, german, germany, and, uebersicht, Uerbersicht, uebersichten, Uebersichten, Übersicht, übersicht, Übersichten, übersichten, Uebersicht, uebersicht, Uebersichten, uebersichten, Info, Infos zu, Information über, ueber, Informationen über, Auskunft, Auskünfte, Auskuenfte, Dienst, PbclevtugFgrsnaEnz, Angebot, Angebote, Anbieter, server, für, fuer, in, an, keyword, keywords, key word, keywords, internet, internets, net, network, net work, networks, net works, web, www, world wide web, Theorie, Praxis, Anwendung, DV, IT, glossar, fachwörterbuch it-glossar, computer lexikon, Computerlexikon, Computer-Lexikon, Lexikon, computer lexicon, Computerlexicon, Computer-Lexicon, Lexicon, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 was ist ein, was ist das, was sind, definiere, definition, define, Inhalt, html, xhtml, free im netz, PDF Text, digital, digitale, binär, binäre, elektronisch, elektronische, fachbegriff, fachbegriffe, konzept, Begriff, allgemein, allgemeine, allgemeines, Technik, Datentechnik, Digitaltechnik, Binätechnik, online lesen; , Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd721551, slrprddef721551, 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/kopierinitialisierung_c++