Klassenvariablen / kosntante Objekte



  • huhu ihrs,

    hab mal 2 Fragen:

    1. Ist eigentlich nur für konstante Klassenvariablen der Wert zur Compiletime bekannt, und der Wert für jegliche anderen Attribute ist erst zur Laufzeit bekannt?

    2. Sind die Attributewerte von konstanten Objekten zur Compiletime bekannt
    oder zur Laufzeit?

    danke schonmal für Antworten 🙂



  • Zur Compilezeit bekannt sind – als Member von Klassen – lediglich statische integrale Konstanten, die mit einem konstanten Ausdruck innerhalb der Klassendefinition initialisiert werden.

    struct t
    {
        static const short value = 257;
    };
    

    Ein konstanter Ausdruck ist dabei ein Ausdruck, dessen Ergebnis schon zur Compilezeit bekannt ist. Darunter fallen beispielsweise Literale, Enumeratoren, Konstanten, die ihrerseits mit einem konstanten Ausdruck initialisiert wurden, Template-Zahl-Parameter, Resultate von sizeof und natürlich arithmetische Ausdrücke, welche bereits zur Kompilierzeit berechnet werden können.



  • okay

    class Foo
    {
        private:
            static const int size;
    };
    
    const int Foo::size = 10;
    

    Also ist hierbei die "10" erst zur Laufzeit bekannt ... ok...

    Nexus schrieb:

    struct t
    {
        static const short value = 257;
    };
    

    Dies funktioniert aber nur mit primitiven Datentypen, oder?

    Und wie ist es hierbei:

    class Foo
    {
        private:
            int i;
    
        public:
            Foo() : i(7) {}
    };
    
    int main()
    {    
        const Foo f;
        return 0;
    };
    

    ist " i " nun auch zur Compiletime bekannt?
    Oder sagt das const bei Objekten einfach nur aus,
    dass man die Attribute nicht verändern darf ?



  • Dweb schrieb:

    Nexus schrieb:

    struct t
    {
        static const short value = 257;
    };
    

    Dies funktioniert aber nur mit primitiven Datentypen, oder?

    Ja, nur mit integralen statischen Konstanten.

    Dweb schrieb:

    Und wie ist es hierbei:

    class Foo
    {
        private:
            int i;
            
        public:
            Foo() : i(7) {}
    };
    
    int main()
    {    
        const Foo f;
        return 0;
    };
    

    ist " i " nun auch zur Compiletime bekannt?

    Nein, nicht-statische Member von Klassen können nie als konstante Ausdrücke verwendet werden. Zur Compilezeit ist der Wert natürlich trotzdem bekannt, aber der Programmierer kann damit nichts anfangen. Der Compiler darf jedoch aus diesem Umstand Nutzen ziehen und optimieren. Wie weit das möglich ist, hängt wohl von der Implementierung ab.

    Dweb schrieb:

    Oder sagt das const bei Objekten einfach nur aus,
    dass man die Attribute nicht verändern darf ?

    Ja, grundsätzlich schon. In C++0x wird es das Schlüsselwort constexpr geben, das genau dafür da ist, konstante Ausdrücke explizit kennzuzeichnen. Dann können zum Beispiel auch Rückgabewerte von Funktionen in diesem Zusammenhang verwendet werden.

    Momentan sorgt jedoch const dafür, dass Variablen zur Kompilierzeit ausgewertet werden können.

    int main()
    {
        const int expr = 42;
    
        double array[expr]; // OK, da expr konstanter Ausdruck
    }
    

Anmelden zum Antworten