class <=> struct <=> union
-
Mal ne ganz allgemeine Frage... *doppelpunkt* ^^
Also ich versuch das ma so weit zusammenzufassen, wie ich denke, es verstanden zu haben:
In C++ sind class und struct identisch (abgesehen vom default-access) - oder!? Und wo war eigtl in C dort der unterschied? Ein union ist "kleiner" als class habe ich gelesen - aber so richtig kapiert / verstanden (mein englisch is da iwie zu schlecht für -.-) hab ich dieses kleiner noch nicht..
'Use only one member at a time'
Wie ist das gemeint? Das ich, wenn ich mit Threads arbeite, das gesamte Union locken muss - egal, was ich daran mache? oder ist das anders gemeint (im vergl. class+struct: 'No usage constraints')
und dann gibst in der msdn extra noch nen diagramm 'Storage of Data in NumericType Union' - aber irgendwie find ich das logisch - oder gibts da iwas besonderes, was ich nicht gesehen habe? (Also dort wird die Größe von "einfachen" und von double werten angegeben, die sich in nem union befinden)...
Das einzige, was ich über union weiß ist, dass es weder virtuelle fkt, noch statische member "kennt"... Dann steht dort auch noch folgendes in etwa: '[kennt public, protected und private aber kann weder vererbt werden noch geerbt werden]'... Warum kennt es dann trotzdem protected?Danke ^^
-
unskilled schrieb:
Mal ne ganz allgemeine Frage... *doppelpunkt* ^^
Also ich versuch das ma so weit zusammenzufassen, wie ich denke, es verstanden zu haben:
In C++ sind class und struct identisch (abgesehen vom default-access) - oder!?
Richtig.
Und wo war eigtl in C dort der unterschied?
Darin, dass es in C kein class gab - und dass structs in C keine Methoden haben und nicht von anderen structs erben können.
Ein union ist "kleiner" als class habe ich gelesen - aber so richtig kapiert / verstanden (mein englisch is da iwie zu schlecht für -.-) hab ich dieses kleiner noch nicht..
'Use only one member at a time'
Wie ist das gemeint? Das ich, wenn ich mit Threads arbeite, das gesamte Union locken muss - egal, was ich daran mache? oder ist das anders gemeint (im vergl. class+struct: 'No usage constraints')Ein Union ist insofern kleiner, als dass alle Member den selben Speicher belegen - soll bedeuten, dass in einem union {A a; B b;} entweder ein A oder ein B ist. Wenn man also in einem union eine bestimmte variable setzt, kann man danach auch nur diese Variable auslesen - der Speicher der anderen vriablen wird ja überschrieben.
union { int i; //belegt bei mir 4 byte double d; //belegt bei mir 12 byte } myunion; //belegt 12 byte, da sich i und d den Speicher teilen myunion.i = 5; //schreib 5 in den int-Bereich int j = myunion.i; //OK myunion.d = 12.0; //schreib 12 in den double-bereich - damit ist der int-bereich überschrieben double d = myunion.d; //OK in k = myunion.i; //FEHLER!! Im Speicher steht ein double, der versuch, 4 bytes davon als int zu itnerpretieren bringt MurksDas machts eventuell Klar, deshalb auch nie zur gleichen Zeit benutzen.
Warum kennt es dann trotzdem protected?
Vermutlich aus Gefälligkeit. Da es nichts vererben kann gibts auch keine Kinder die auf protected elemente zugreifen können, daher gilt für unions wohl protected = private.
-
unskilled schrieb:
In C++ sind class und struct identisch (abgesehen vom default-access) - oder!?
Ja.
unskilled schrieb:
Und wo war eigtl in C dort der unterschied?
In C gibt's keine Klassen und alle Member einer
structsind public.unskilled schrieb:
Ein union ist "kleiner" als class habe ich gelesen - aber so richtig kapiert / verstanden (mein englisch is da iwie zu schlecht für -.-) hab ich dieses kleiner noch nicht..
Eine Klasse hat mit einem Union garnix zu tun.
unskilled schrieb:
'Use only one member at a time' Wie ist das gemeint? Das ich, wenn ich mit Threads arbeite, das gesamte Union locken muss - egal, was ich daran mache?
Ja.
union foo_t { unsigned char memory[ 2 ]; unsigned short number; };Entweder du greifst über memory auf die zwei Bytes zu, oder über number. Beidesmal ist es der selbe Speicherbereich.
greetz, Swordfish
-
ahhhh : >>
Danke - jz wird das alles klar - das macht auf einmal nen sinn, was da steht - komisch ;o)