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?
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
structX
4
{
5
X(inti):member_(i){}
6
7
intmember_;
8
};
9
10
intmain()
11
{
12
classXa(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:
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 :-)