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ürzer

    NamespaceTest a(1, 2.2);
    // bzw.
    NamespaceTest a{1, 2.2};
    

    schreiben.



  • cool danke!


Anmelden zum Antworten