Aufgabe/Code lesen

bagration

Newbie
Registriert
Feb. 2019
Beiträge
4
C++:
#include <iostream>
using namespace std;

class X {
   int a;
public:
   X(int n = 6) : a {n} {}
   X(const X& x) : a{x.a} {cout << "CP";}
   friend ostream& operator<<(ostream&, X);
};

ostream& operator<<(ostream& o, X x) {
   return  o << x.a+4;
}

int main() {
   X x {1};
   cout << x;
   return 0;
}//Danke fuer die zahlreichen Antworten und tipps!
//Eine Frage noch: werden in dem Fall beide Konstruktoren (also Defaultkonstruktor und der Kopierkonstruktor) aufgerufen, oder wie funktioniert das?
 
Zuletzt bearbeitet:
Nach welcher Programmiersprache fragst du denn? Das wäre dann für Außenstehende einfacher nachzuvollziehen, statt im Kopf verschiedene Sprachen durchzugehen. ;)
 
Die Antwort auf deine versteckte Frage als Kommentar im nicht formatierten Code sollte wohl ja sein. Ist ein Copy Konstrukor. Was soll es sonst sein?
Ist halt quasi immer nach folgendem Schema:
C++:
ClassName (const ClassName &old_obj);
 
Füg mal Code-Tags ein.
C++:
C++ Code

Kannst du evtl. nicht wissen, aber das ist Standard in Foren, weil Code sonst nur schwer zu lesen ist. Und wird schnell als Unhöflichkeit wahrgenommen, wenn man sich die 'Mühe' nicht macht. Im Editor auf die Punkte "Einfügen" und dann auf "Code" drücken.

Persönlich bin ich ja dafür, alle solche Threads zu schließen, bis der TE Code-Tags eingebaut hat.
 
  • Gefällt mir
Reaktionen: BAGZZlash
andy_m4 schrieb:
Und optimalerweise im eingerückten Zustand einfügen. :-)
Absolut, ein Vorteil der Code-Tags ist ja auch, dass in Fließtext vorangestellte Whitespaces entfernt werden, nicht so für Text, der in Code-Tags steht. Hab ich grad extra nochmal mithilfe der Vorschau-Funktion gegengeprüft :D.
 
Code:
      ._________________________.
      | Das kann auch           |
      |     für die             |
      |     Textgestaltung      |
      | ganz nützlich sein. :-) |
      '-------------------------'
Ich denk da so an UML-Diagramme, Programmablaufpläne oder gar Strukturgramme. :-)
 
a ist kein Objekt der Klasse X, sondern eine Membervariable vom Typ int.
Beim Aufrufen des <<-Operators wird der Copy-Konstruktor ausgeführt. Kommentierst du Zeile 20 8 aus, so wird der implizit vom Compiler deklariert und es wird dir kein "CP" ausgegeben. Für eine Plain-Old-Data Klasse ist das Anlegen eines eigenen Copy-Konstruktors eher unnötig.
Ergänzung ()

Code Tags bitte für Code nutzen, Fragen im normalen Textkörper stellen.
Und in dem Fall musst du auch nicht ständig editieren, sondern kannst ganz normal antworten, das erhält die Übersichtlichkeit.
Vielleicht hilft dir folgender Beispielcode ein wenig weiter:
C++:
#include <iostream>
using namespace std;

class X {

public:
int a;
X(int n = 6) : a {n} {cout << "Default constructor executed.\n";}

X(const X& x) : a{x.a} {cout << "Copy constructor executed.\n";}
};

void testfunction1(X x)
{
    cout << x.a << "\n";
}

void testfunction2(X* x)
{
    cout << x->a << "\n";
}

int main() {
cout << "Instantiate x.\n";
X x {1};
cout << "testfunction1\n";
testfunction1(x);
cout << "testfunction2\n";
testfunction2(&x);

return 0;
}
 
Zuletzt bearbeitet: (Aus Zeile 20 ist jetzt natürlich acht geworden)
  • Gefällt mir
Reaktionen: abcddcba
Danke! Habe voellig diese operator<< uebresehen. Von dort aus wird der copy Konstruktor aufgerufen. Jetzt ist alles klar.
Ergänzung ()

Sorry! Wie schliesst man hier den thread?
 
  • Gefällt mir
Reaktionen: abcddcba
Im Normalfall werden Threads hier gar nicht geschlossen. Einfach nichts mehr reinschreiben tut's auch. Und falls später jemand eine zu diesem Thema spezifische Frage hat, kann der Thread sozusagen reaktiviert werden.
 
Zurück
Oben