const int kann mit gewöhnlicher nicht-const methode initialisiert werden?
-
hallo,
Ich lerne gerade C++ und experimentiere etwas herum. Warum klappt der folgende code? Eigentlich ist müsste die Methode
int get_member(){...}
als const definiert werden oder? weil in der main ja ein const int initialisiert wird, muss die funktion einen const qualifier haben so steht es in dem buch da bin ich sicher.
#ifndef GUARD_namespacetest_h #define GUARD_namespacetest_h class NamespaceTest { public: NamespaceTest(int, double); int get_member(); double get_member2() const; private: int member; double member2; }; #endif
#include "NamespaceTest.h" #include "CircularIncludeTest.h" int NamespaceTest::get_member() { return member; } double NamespaceTest::get_member2() const{ return member2; } NamespaceTest::NamespaceTest(int a, double b): member(a), member2(b){};
#include <iostream> #include <vector> #include "NamespaceTest.h" #include <iterator> #include <string> #include <algorithm> #include <map> #include <iterator> #include <string> int main(){ NamespaceTest a = NamespaceTest(1,2.2); const int test_const = a.get_member(); std::cout << test_const << std::endl; return 0; }
-
Es geht nicht um den Rückgabetyp, sondern um das benutzte Objekt (d.h. bei dir
a
).
Test mal mit:const NamespaceTest a = NamespaceTest(1,2.2); int test_const = a.get_member();
Man kann jederzeit eine konstante Variable (ja, eigentlich ein Widerspruch) mit einem beliebigen Wert initialisieren, jedoch danach diese nicht mehr verändern:
const int test_const = a.get_member(); test_const++; // <- Compilerfehler, weil als `const` deklariert
Mehr darüber kannst du in C++ Const Correctness (auf englisch) nachlesen (oder dir übersetzen lassen).
PS:
Du kannst die Initialisierung auch kürzerNamespaceTest a(1, 2.2); // bzw. NamespaceTest a{1, 2.2};
schreiben.
-
cool danke!