494 Stimmen

Was sind die Unterschiede zwischen struct und class in C++?

Diese Frage war die bereits im Zusammenhang mit C#/.Net gestellt wurden .

Jetzt würde ich gerne die Unterschiede zwischen einer Struktur und einer Klasse in C++ kennenlernen. Bitte erörtern Sie die technischen Unterschiede sowie die Gründe für die Wahl des einen oder des anderen im OO-Design.

Ich werde mit einem offensichtlichen Unterschied beginnen:

  • Wenn Sie nicht angeben public: o private: Die Mitglieder einer Struktur sind standardmäßig öffentlich; die Mitglieder einer Klasse sind standardmäßig privat.

Ich bin sicher, dass es noch weitere Unterschiede gibt, die in den obskuren Ecken der C++-Spezifikation zu finden sind.

15voto

Suraj K Thomas Punkte 5425
  1. Mitglieder einer Klasse sind standardmäßig privat und Mitglieder von struct sind standardmäßig öffentlich .

Zum Beispiel schlägt Programm 1 bei der Kompilierung fehl, während Programm 2 problemlos funktioniert.

// Program 1
#include <stdio.h>

class Test {
    int x; // x is private
};

int main()
{
  Test t;
  t.x = 20; // compiler error because x is private
  getchar();
  return 0;
}

// Program 2
#include <stdio.h>

struct Test {
    int x; // x is public
};

int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}
  1. Bei der Ableitung eines struct aus einer Klasse/einemstruct, Standard-Zugriffsspezifikation für eine Basisklasse/-struktur ist public . Und bei der Ableitung einer Klasse, Standard-Zugriffskennung ist privat .

Beispielsweise schlägt Programm 3 bei der Kompilierung fehl, während Programm 4 problemlos funktioniert.

// Program 3
#include <stdio.h>

class Base {
public:
    int x;
};

class Derived : Base { }; // is equivalent to class Derived : private Base {}

int main()
{
  Derived d;
  d.x = 20; // compiler error because inheritance is private
  getchar();
  return 0;
}

// Program 4
#include <stdio.h>

class Base {
public:
    int x;
};

struct Derived : Base { }; // is equivalent to struct Derived : public Base {}

int main()
{
  Derived d;
  d.x = 20; // works fine because inheritance is public
  getchar();
  return 0;
}

11voto

64BitBob Punkte 3077

STRUCT ist ein Typ eines abstrakten Datentyps, der einen bestimmten Speicherbereich entsprechend der Strukturspezifikation aufteilt. Structs sind besonders nützlich bei der Serialisierung/Deserialisierung von Dateien, da die Struktur oft wortwörtlich in die Datei geschrieben werden kann. (d.h. Sie erhalten einen Zeiger auf die Struktur, verwenden das SIZE-Makro, um die Anzahl der zu kopierenden Bytes zu berechnen, und verschieben dann die Daten in oder aus der Struktur).

Klassen sind eine andere Art von abstrakten Datentypen, die versuchen, Informationen zu verbergen. Intern kann es eine Vielzahl von Mechanismen, Methoden, temporären Variablen, Zustandsvariablen usw. geben, die alle dazu dienen, jedem Code, der die Klasse verwenden möchte, eine einheitliche API zu präsentieren.

In der Tat geht es bei Strukturen um Daten, bei Klassen um Code.

Sie müssen jedoch verstehen, dass es sich hierbei lediglich um Abstraktionen handelt. Es ist durchaus möglich, Structs zu erstellen, die wie Klassen aussehen, und Klassen, die wie Structs aussehen. Tatsächlich waren die ersten C++-Compiler lediglich Vorkompiler, die C++-Code in C übersetzten. Diese Abstraktionen sind also ein Vorteil für das logische Denken, nicht unbedingt ein Vorteil für den Computer selbst.

Abgesehen von der Tatsache, dass es sich bei jeder Klasse um eine andere Art von Abstraktion handelt, bieten Klassen Lösungen für das Rätsel der Benennung von C-Code. Da man nicht mehr als eine Funktion mit demselben Namen haben kann, folgten die Entwickler früher dem Muster _(). z.B. mathlibextreme_max(). Durch die Gruppierung von APIs in Klassen können ähnliche Funktionen (hier nennen wir sie "Methoden") in Gruppen zusammengefasst und vor der Benennung von Methoden in anderen Klassen geschützt werden. Dies ermöglicht es dem Programmierer, seinen Code besser zu organisieren und die Wiederverwendung von Code zu erhöhen. Zumindest theoretisch.

8voto

Skizz Punkte 66931

Der einzige andere Unterschied ist die Standardvererbung von Klassen und Strukturen, die - wenig überraschend - privat bzw. öffentlich ist.

6voto

Der Unterschied zwischen class y struct ist ein Unterschied zwischen Schlüsselwörtern, nicht zwischen Datentypen. Diese beiden

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

definieren beide eine Klassenart. Der Unterschied zwischen den Schlüsselwörtern in diesem Zusammenhang ist der unterschiedliche Standardzugriff:

  • foo::x ist öffentlich und foo_base wird öffentlich vererbt
  • bar::x ist privat und bar_base wird privat vererbt

5voto

  1. Die Mitglieder einer Struktur sind standardmäßig öffentlich, die Mitglieder einer Klasse sind standardmäßig privat.
  2. Die Standardvererbung für Structure von einer anderen Struktur oder Klasse ist public, die Standardvererbung für Class von einer anderen Struktur oder Klasse ist private.

    class A{
    public:
    int i;
    };

    class A2:A{
    };

    struct A3:A{
    };

    struct abc{
    int i; };

    struct abc2:abc{
    };

    class abc3:abc{ };

    int _tmain(int argc, _TCHAR* argv[]) {
    abc2 objabc; objabc.i = 10;

    A3 ob;
    ob.i = 10;
    
    //A2 obja; //privately inherited
    //obja.i = 10;
    
    //abc3 obss;
    //obss.i = 10;

    }

Dies ist auf VS2005.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X