www.mikrocontroller.net

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


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in einer Stuct ist der Default public, in der Class Private:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

#include <iostream>

struct X
{
  X( int i ) : member_( i ) {}
  
  int member_;
};

int main()
{
  class X a( 5 );
  
  std::cout << a.member_ << std::endl;
}

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.

Autor: MaWin (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
template <class T> void foo(const T& value);

Das dagegen nicht:
template <struct T> void foo(const T& value);

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

> ...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

>...

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Java ist auch eine Insel (Gast)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.