Hallo! Wo ist bei C++ eigentlich der Unterschied zwischen struct und class? Beide können private und öffentliche Member haben, können mit Methoden und Konstruktor/Destruktor ausgestattet werden, ect... Ist struct evtl. nur aus historischen Gründen/zur Kompatibilität mit C im Sprachumfang enthalten?
in einer Stuct ist der Default public, in der Class Private: Ich glaube Stucts können keine Constructoren, Destructoren und Methoden haben
Peter schrieb: > in einer Stuct ist der Default public, in der Class Private: > > Ich glaube Stucts können keine Constructoren, Destructoren und Methoden > haben Doch, können sie. Der einzigen Unterschiede sind: * wie du schon gesagt hast: per Default sind alle Member public * Bei Ableitungen (Überraschung: Ja man kann auch mit structs Hierarchien bauen) wird public abgeleitet, bei einer Klasse private. Ansonsten sind sie in allen anderen Belangen gleich. Man kann sie sogar in einem gewissen Sinne gegeneinander austauschen
1 | #include <iostream> |
2 | |
3 | struct X |
4 | {
|
5 | X( int i ) : member_( i ) {} |
6 | |
7 | int member_; |
8 | };
|
9 | |
10 | int main() |
11 | {
|
12 | class X a( 5 ); |
13 | |
14 | std::cout << a.member_ << std::endl; |
15 | }
|
Obwohl X als struct definiert wurde, habe ich bei a angegeben, dass es sich um eine class X handelt :-) Ist legal, aber klarerweise werden die meisten Compiler warnen, da sowas nur Verwirrung schafft.
Eine virtuelle class enthält einen versteckten Verweis auf seine Klasse (VTABLE pointer mit RTTI type information), ebenso wie die Klassenfunktionen einen versteckten Paramter enthalten, der auf das Objekt verweist. Da die meisten Programmierer heute nicht mehr wissen, was sie da an verstecktem Kram rumschleppen, damit C++ so funktioniert wie C++ funktionieren soll, werden Programme gross und langsam.
MaWin schrieb: > Da die meisten Programmierer heute nicht mehr wissen, was sie da an > verstecktem Kram rumschleppen, damit C++ so funktioniert wie C++ > funktionieren soll, werden Programme gross und langsam. Jetzt bist du unfair. Wenn die äquivalente Funktionalität in C implementierst, ist das * auch nicht kleiner * und auch nicht langsamer Speziell der Einsatz von virtuellen Funktionen, wo sie notwendig sind, bringt nur Vorteile. Ganz im Gegenteil: sie sind wartbarer, weniger fehleranfällig und schneller gehts meistens auch noch als so eine elends lange if-then-else oder switch-case Verteilerleiste, bei der bei einer Programmerweiterung die Hälfte vergessen wird anzupassen. Und der hidden this Pointer in einer Memberfunktion. Den hast du, wenn du in C ähnliches machst) dort ebenfalls.
@MaWin:
> Eine virtuelle class enthält einen versteckten Verweis auf seine Klasse
Du meinst eine polymorphe Klasse. Aber was hat das eigentlich mit der
Frage zu tun?
Die beiden einzigen Unterschiede zwischen 'struct' und 'class' sind
einerseits das schon genannte public/private bei Ableitung und Membern
und andererseits, daß man 'class' bei Template-Parametern alternativ zu
'typename' einsetzen kann, 'struct' aber nicht. Also folgendes ist
erlaubt:
1 | template <class T> void foo(const T& value); |
Das dagegen nicht:
1 | template <struct T> void foo(const T& value); |
wobei das class beim template doch nicht die gleiche Bedeutung hat, wie bei einer Klasse. Das class bei einer Template-Deklaration ist doch nur ein anderes Wort für typename, oder nicht?
> Aber was hat das eigentlich mit der Frage zu tun? Lies sie einfach noch mal. Kann eine struct einen VTABLE pointer haben ? Kann eine struct unsichtbar mehr enthalten, als man im Code hingeschrieben hat? > Wenn die äquivalente Funktionalität in C implementierst, > ist das auch nicht kleiner und auch nicht langsamer In C implementiert man das aber nur, wenn man es braucht, schliesslich fällt es optisch im Code auf, in C++ geh ich mal davon aus wird es in 90% der Fälle unbenutzt rumgeschleppt weil der Entwickler es übersehen hat.
> In C implementiert man das aber nur, wenn man es braucht, > schliesslich fällt es optisch im Code auf, > in C++ geh ich mal davon aus wird es in 90% der Fälle > unbenutzt rumgeschleppt weil der Entwickler es übersehen hat. Klar, ich programmiere in C++ eine Klasse, schreibe Member-Funktionen, und schleppe den this-Pointer unnötig rum, weil die Klasse keine Member-Variablen hat? Als ob 90% aller Objekte keine Variablen haben. Und falls man ein Variablen-Loses Objekt hat (was dann eher eine Funktions-Sammlung ist) markiert man die Funktionen einfach static, dann gibts keinen this-Pointer. Und wer einfach alle Funktionen als virtual markiert, obwohl es in 90% der Fälle unsinnig ist, hat etwas falsch verstanden. Und so grauenhaft langsam ist eine virtual-Funktion auch wieder nicht. Langsamkeit von Programmen kommt da wohl eher von ungeschickt Programmierten Algorithmen, aber bestimmt nicht von zu vielen virtual-Funktionen. Und während wir so etwas diskutieren, schreiben Leute Programme in Sprachen, die, während das Programm ausgeführt wird, die Funktions-Namen in Tabellen suchen um die Implementierung zu finden. Nennt sich Interpreter.
Auf dem Mikrokontroller kann ein vtable-Pointer mehr oder weniger schon mal was ausmachen. Aber dieses "Problem" ist ja wohl eher der Spezialfall, als die Regel. Und wer nicht weiss, was er tut hatte schon immer Probleme ;-) Die Performance-Probleme von OO-Programmen kommen im Allgemeinen auch nicht von sowas, sondern von der hoeheren Abstraktion und Kapselung. Die fuehrt schon zu einer gewissen Fahrlaessigkeit im Umgang mit Resourcen - aber ohne Abstraktion und Kapselung ist die Komplexitaet, die mit grossen Applikationen oft einher geht, kaum in den Griff zu bekommen. Das ist halt der Preis.
MaWin schrieb: >> Aber was hat das eigentlich mit der Frage zu tun? > > Lies sie einfach noch mal. > > Kann eine struct einen VTABLE pointer haben ? > Kann eine struct unsichtbar mehr enthalten, als man > im Code hingeschrieben hat? Ja, kann sie. Eine struct ist in C++ genauso verwendbar wie eine class, inklusive Vererbung, virtuellen Methoden und allem Drumrum. Neben der unterschiedlichen Voreinstellung von public bzw. private (die nötig ist, um in C++ eine struct kompatibel zu C zu machen) sind sie austauschbar. > ...
@Klaus: > wobei das class beim template doch nicht die gleiche Bedeutung hat, wie > bei einer Klasse. Das class bei einer Template-Deklaration ist doch nur > ein anderes Wort für typename, oder nicht? Genau das hab ich doch geschrieben. @MaWin: >> Aber was hat das eigentlich mit der Frage zu tun? > > Lies sie einfach noch mal. Ok, habe ich. Die Frage war, was der Unterschied zwischen class und struct ist. > Kann eine struct einen VTABLE pointer haben ? > Kann eine struct unsichtbar mehr enthalten, als man > im Code hingeschrieben hat? Ja.
Niklas Gürtler schrieb: >... > Und wer einfach alle Funktionen als virtual markiert, obwohl es in 90% > der Fälle unsinnig ist, hat etwas falsch verstanden. - oder programmiert nicht C++, sondern Java. Da ist alles virtual. >...
Klaus Wachtler schrieb:
> - oder programmiert nicht C++, sondern Java. Da ist alles virtual.
Ach, das waere schoen. Leider ist Java fuer mich ziemlich real :-)
Ach, sooo schlecht ist Java auch wieder nicht. Normal werden doch nur gute Sachen kopiert :)
Das virtual haben sie leider so gut kopiert, daß es gar kein nicht-virtual mehr gibt. Statische Bindung haben sie leider vergessen zu kopieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.