2013-02-11 6 views
19

Soweit ich es verstehe grundlegende Typen sind Scalar und Arrays sind aggregiert, aber was ist mit benutzerdefinierten Typen? Nach welchen Kriterien würde ich sie in die zwei Kategorien einteilen?Was ist ein skalares Objekt in C++?

struct S { int i; int j }; 
class C { public: S s1_; S s2_ }; 
std::vector<int> V; 
std::vector<int> *pV = &v; 
+0

Ich glaube, Sie möchten die Rechtschreibung und Syntax Ihres einleitenden Absatz bereinigen, und möglicherweise auf es ein bisschen expanind, wenn Sie nützliche Antworten wollen – tletnes

+0

Sie meinen „Typen“ und „Aggregat“? – us2012

+2

@ us2012: "Tapes and Arrogates" sollte eine Indie-College-Band sein. –

Antwort

29

Kurzversion: Typen in C++ sind:

  • Objekttypen: Skalare, Arrays, Klassen, Gewerkschaften

  • Referenztypen

  • Funktionstypen

  • (Member-Typ) [siehe unten]

  • void


Lange Version

  • Objekttypen

    • Skalare

      1. Arithmetik (Integral, float)

      2. Zeiger: T * für jede Art T

      3. enum

      4. pointer-to-Mitglied

      5. nullptr_t

    • Arrays: T[] oder T[N] für jeden vollständigen, nicht-Referenztyp T

    • Klassen: class Foo oder struct Bar

      1. Trivial Klassen

      2. Aggregates

      3. POD-Klassen

      4. (usw. etc.)

    • Unions: union Zip

  • Referenzen Typen: T &, T && für jedes Objekt oder freiFunktionsTyp T

  • Funktionstypen

    • Freie Funktionen: R foo(Arg1, Arg2, ...)

    • Mitglied Funktionen: R T::foo(Arg1, Arg2, ...)

  • void

Mitglied Typen wie diese funktionieren. Ein Mitgliedstyp hat das Format T::U, aber Sie können keine Objekte oder Variablen vom Elementtyp haben. Sie können nur Mitglied Zeiger haben. Ein Mitgliedszeiger hat den Typ T::* U und ist ein Zeiger-zu-Stab-Objekt, wenn U ein (freier) Objekttyp und eine Zeiger-zu-Stab-Funktion ist, wenn U ein (freier) Funktionstyp ist.

Alle Typen sind vollständig, mit Ausnahme von void, unsymmetrischen Arrays und deklarierten, aber nicht definierten Klassen und Unionen. Alle unvollständigen Typen außer void können abgeschlossen werden.

Alle Typen können const/volatile qualifiziert werden.

Der Header <type_traits> bietet Merkmalsklassen zur Prüfung auf jede dieser Typeneigenschaften.

22

ich denke, das eine umfassendere Antwort wäre:

enter image description here

Originaldokument:
http://howardhinnant.github.io/TypeHiearchy.pdf

ein Skalar ist ein fundamentaler außer es nicht leer sein kann, aber es kann sein, Zeigertyp oder ein Enum-Typ.

Und ein Fundamental hat ein Schlüsselwort in der Sprache. Es ist leicht zu erkennen, wenn das so gesagt wird.

3

Es gibt eine Reihe von Bibliotheksklassen, die zum Testen des Variablentyps verwendet werden. std::is_scalar kann verwendet werden, um zu testen, ob ein Objekt ein Skalar ist.

A skalaren Typ ist eine Art, die Funktionalität für den Additionsoperator ohne Überlastungen (arithmetisches, pointer, pointer Mitglied, ENUM und std::nullptr_t)-in gebaut hat.

Auch eine Tabelle von here.

C++ Type Categories