Forum: PC-Programmierung C++: unterschied struct / class


von Klaus (Gast)


Lesenswert?

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?

von Peter (Gast)


Lesenswert?

in einer Stuct ist der Default public, in der Class Private:

Ich glaube Stucts können keine Constructoren, Destructoren und Methoden 
haben

von Karl H. (kbuchegg)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

@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);

von Klaus (Gast)


Lesenswert?

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?

von MaWin (Gast)


Lesenswert?

> 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.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

> 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.

von P. S. (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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.

> ...

von Rolf Magnus (Gast)


Lesenswert?

@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.

von Klaus W. (mfgkw)


Lesenswert?

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.

>...

von P. S. (Gast)


Lesenswert?

Klaus Wachtler schrieb:

> - oder programmiert nicht C++, sondern Java. Da ist alles virtual.

Ach, das waere schoen. Leider ist Java fuer mich ziemlich real :-)

von Java ist auch eine Insel (Gast)


Lesenswert?

Ach, sooo schlecht ist Java auch wieder nicht. Normal werden doch nur 
gute Sachen kopiert :)

von Klaus W. (mfgkw)


Lesenswert?

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
Noch kein Account? Hier anmelden.