Was macht der Standardkonstruktor?
-
Was genau macht der Standardkonstruktor?
Ruft der nur andere Standardkonstruktoren auf, oder initialisiert er auch alle Member mit 0?
-
Er initialisiert nichts, wenn du es nicht explizit in der Initialisierungsliste machst. Die Standardkonstruktoren der Member werden natürlich aufgerufen.
/EDIT:
Ich ging vom Default-Konstruktor aus.
-
Was meinst du mit Standardkonstruktor, den Begriff gibt's in C++ nicht.
Meinst du einen auomatisch definierten Default-Konstruktor?
Oder meinst du einen userdefinierten Default-Konstruktor?
Oder meinst du ... irgendwas anderes?
-
hustbaer schrieb:
Was meinst du mit Standardkonstruktor, den Begriff gibt's in C++ nicht.
Was heisst "in C++"? Im Standard wohl eher nicht, ja. Was die Literatur betrifft, kann ich nicht viel sagen, da ich keine deutschen C++-Bücher besitze. Aber ich würde nicht sagen, der Begriff wird von der Community nicht verwendet. Auch Visual Studio benutzt ihn (wobei die auch Vorlagen für Templates benutzen ;))...
"Default-Konstruktor" ist wahrscheinlich klarer, aber für falsch halte ich "Standardkonstruktor" nicht. Im Gegensatz zu vielen anderen Ausdrücken wie "konstante Referenz", die tatsächlich andauernd falsch benutzt werden, aber niemanden stören. Wenn, dann sollte man bei letzteren anfangen, weil sie den Leuten (besonders Anfängern) ein falsches Verständnis von der Sache vermitteln.
-
Ich meine den automatisch definierten Default-Konstruktor, und da ich heute mal deutsch war, und Visual Studio den Begriff auch immer benutzt hab ich Standardkonstruktor geschrieben. Im Endeffekt der gleiche Begriff in zwei unterschiedlichen Sprachen
-
Ihr seid aber kleinlich
Ich lese auch nur englische Literatur, aber dass mit Standardkonstruktor wohl default-constructor gemeint ist dürfte klar sein.
Und was ist an konstanter Referenz falsch? Referenzen sind nunmal konstant. Mag sein, dass Anfänger dadurch denken, dass das referenzierte Objekt konstant ist, aber dann sollte man eben ein wenig drüber nachdenken. Wenn ich von einem konstanten Zeiger rede, dann mein ich auch nur den Zeiger und nicht das Objekt, auf den er zeigt.
-
inter2k3 schrieb:
Und was ist an konstanter Referenz falsch? Referenzen sind nunmal konstant. Mag sein, dass Anfänger dadurch denken, dass das referenzierte Objekt konstant ist, aber dann sollte man eben ein wenig drüber nachdenken. Wenn ich von einem konstanten Zeiger rede, dann mein ich auch nur den Zeiger und nicht das Objekt, auf den er zeigt.
Ähh, du bist gerade das beste Beispiel für jemanden, der drauf reingefallen ist.
-
Wieso das.
Ne Referenz ist ein konstanter Pointer - wird halt jedesmal dereferenziert, jedenfalls meiner Vorstellung nach.
Gut - in dem Fall ist es ein wenig redundant wenn man von konstanter Referenz redet.
-
naja aber eine referenz kann auch auf etwas andres zeigen, oder irre ich mich da?
und somit wäre nicht das "gezeigte" objekt konstant und auch nicht der zeiger (sprich die referenz)
-
Es geht darum, dass der im deutschen geläufige Begriff "konstante Referenz" Anfänger verwirrt und bei ihnen einen falschen Eindruck von der Sprache erweckt. Denn damit meint man so etwas:
const int&
Das steht in vielen deutschen Büchern als konstante Referenz auf Integer.Verstehst du nun?
-
Wenn die Referenz initialisiert wurde dann bleibt sie an das entsprechende Objekt gebunden. Du kannst sie nicht als alias für ein anderes Objekt verwenden.
Mag sein dass ich mir die Implementierung der Referenz falsch vorstelle, aber es wird auch irgendwie nirgends erklärt wie und was nun genau Phase ist. Weder im Primer noch im Struppi (welcher schreibt: "The obvious implementation of a reference is as a (constant) pointer that is dereferenced each
time it is used."
Allerdings steht da nunmal auch das Wort "obvious", was mir also letztendlich immernoch nicht sagt, wie es nun tatsächlich gehandhabt wird.P.S.: ja ich verstehe was gemeint ist wenn ihr sagt, dass konstante Referenz falsch verstanden wird, aber genau deshalb meinte ich ja, dass man da auch mal ein wenig nachdenken muss. Das wäre für mich nämlich schlicht eine Referenz auf einen konstanten int und keine konstante Referenz (bescheuerte Übersetzung würde ich sagen).
Dann müsste aber const int * aucha als konstanter Zeiger übersetzt werden bzw. von den Anfängern betrachtet werden, was sicherlich nicht der Fall ist.P.P.S: Die Diskussion wird allerdings gerade ein wenig OT, also belassen wir es lieber dabei. Ich weiss, was ihr meint und gebe euch bei solchen Übersetzungen natürlich recht.
-
Nexus schrieb:
hustbaer schrieb:
Was meinst du mit Standardkonstruktor, den Begriff gibt's in C++ nicht.
Was heisst "in C++"? Im Standard wohl eher nicht, ja. Was die Literatur betrifft, kann ich nicht viel sagen (...) Aber ich würde nicht sagen, der Begriff wird von der Community nicht verwendet.
Ich hätte vermutlich nichts dazu geschrieben, wenn der Rest meiner Frage nicht trotzdem noch offen gewesen wäre: automatisch generiert oder userdefiniert?
Nun zum sinnvolleren Teil dieses Beitrags ...
__..-- schrieb:
Ich meine den automatisch definierten Default-Konstruktor
Der macht genau dasselbe wie ein "leerer" userdefinierter Default-Konstruktor machen würde:
Klassenname::Klassenname() { }
Gotcha: es kann trotzdem einen Unterschied machen ob man einen "leeren" Default-Konstruktor definiert, oder keinen Konstruktor definiert (und damit einen implizit definierten Default-Konstruktor bekommt). Also obwohl beide das selbe tun (wenn sie aufgerufen werden).
Beispiel:
#include <iostream> #include <cstdlib> #include <ctime> #include <typeinfo> struct POD { int a; }; struct NON_POD { NON_POD() {} int a; }; struct FOO { POD p; int a; }; struct BAR { NON_POD p; int a; }; void make_observable(void* p) { std::cout << "(dummy output " << p << ")\n"; } void smudge(void* pv) { unsigned char* p = static_cast<unsigned char*>(pv); make_observable(p); for (size_t i = 0; i < 1024; i++) p[i] = 0xcc; } template <class T> void test(void* storage_ptr) { smudge(storage_ptr); T* t = new(storage_ptr) T(); std::cout << typeid(T).name() << "::a = " << t->a << "\n\n"; t->~T(); } int main() { long long storage[1024 / sizeof(long long)]; void* storage_ptr = &storage[0]; test<POD>(storage_ptr); test<NON_POD>(storage_ptr); test<FOO>(storage_ptr); test<BAR>(storage_ptr); return 0; }
Bemerkung am Rande: die kompliziert aussehende test() Funktion hat nur den Zweck nichts dem Zufall zu überlassen. Bei MSVC kann man das was das Beispiel zeigen soll auch mit folgender test() Funktion schön sehen, wenn man im Debug Mode compiliert:
template <class T> void test(void* /* brauchen wir nicht*/) { T t = T(); std::cout << typeid(T).name() << "::a = " << t.a << "\n\n"; }
(Natürlich funktioniert das ganze auch ganz ohne Template)
Überlegt euch was eurer Meinung nach dabei rauskommen sollte.
Für die die es dann nicht selbst ausprobieren wollen:C++ (gcc-4.3.4): http://ideone.com/ELBb3
C++0x (gcc-4.5.1): http://ideone.com/Edf59Der erste Link ist der Output den ich erwartet habe. Warum gcc 4.5.1 im C++0x Modus was anderes macht weiss ich nicht (k.a. ob das laut neuem Standard richtig ist, vielleicht kann mich ja hier einer der Standard-Kenner aufklären).
-
Nexus schrieb:
hustbaer schrieb:
Was meinst du mit Standardkonstruktor, den Begriff gibt's in C++ nicht.
Was heisst "in C++"? Im Standard wohl eher nicht, ja. Was die Literatur betrifft, kann ich nicht viel sagen, da ich keine deutschen C++-Bücher besitze. Aber ich würde nicht sagen, der Begriff wird von der Community nicht verwendet. ...
Soweit ich das überblicke wird der Begriff sowohl in Übersetzungen als auch von deutschen Autoren verwendet. Er ist also recht gebräuchlich.