C++: unterschied struct / class

Gast #1346027
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?
#1346039
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.
Gast #1346041
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.
#1346058
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.
Gast #1346133
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);
Gast #1346188
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.
Persönliche Seite #1346236
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.
Gast #1346247
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.
#1346286
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.

> ...
Gast #1346289
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren