Compiler Konstanten berechnen lassen



  • Ok, das heißt, definitionen "in-class" werden zur Compilezeit bearbeitet, Definitionen außerhalb aber erst zur Laufzeit?

    Eine andere Frage: Warum funktioniert mein Code nur mit einem Pointer, nicht aber mit k als Array?


  • Mod

    Illuminatus schrieb:

    Ok, das heißt, definitionen "in-class" werden zur Compilezeit bearbeitet, Definitionen außerhalb aber erst zur Laufzeit?

    Zuerst einmal ein bisschen Begriffsklärung:

    // irgenwelche Typen T, U
    class Foo
    {
        static T x; // Deklaration
        U y;        // Definition
    };
    
    T Foo::x; // Definition
    

    Es ist möglich, den Membern bereits in der Klassendefinition einen Initialisierer mtizugeben. Dieser Initialisierer muss ein konstanter Ausdruck sein. Dieser Initialisierer macht aus der Deklaration keine Definition.
    In C++98 ist das allerdings auf statische konstante integrale Member beschränkt. Eine seperate Definition (dann ohne Initialisierer) ist ggf. trotzdem erforderlich.
    In C++0x ist das nicht mehr auf integrale Typen beschränkt, jetzt muss es ein literal Typ sein; erfolgt die Initialisierung mittels Initialisierungsliste, muss dabei jeder einzelne Initialisierer ein konstanter Ausdruck sein. (Anm. gcc beherrscht die Initialisierung in der Klasse mittels geschweifter Klammern noch nicht, deshalb funktioniert das Ganze gegenwärtig noch nicht mit Arrays).

    Erfolgt die Initialisierung außerhalb der Klasse, muss der Initialisierer kein konstanter Ausruck sein, in diesem Falle ist dann aber das initialisierte Objekt nicht in konstanten Ausdrücken verwendbar.


  • Mod

    Und noch zur zweiten Frage: Arrays haben in C und C++ ein ganz anderes Verhalten als die anderen Basisdatentypen:

    int *P;
    int foo[3];
    int bar[3];
    bar = foo; // Geht nicht, Arrays kann man nicht zuweisen
    bar = p;   // Geht erst recht nicht, ein Array ist kein Pointer!
    p = foo;   // Das ist ok, p ist nun ein Zeiger auf das erste Element von foo (Stichwort: Array to Pointer decay)
    


  • Aah ok, jetzt weiß ich Bescheid, danke! 🙂

    EDIT: Das VErhalten von Arrays kenne ich, ich wusste nur nicht, warum sich diese nur über geschweifte Klammern initialisieren lassen.


Anmelden zum Antworten