Überladung als const und "non-const"



  • Hallo,

    wenn ich zwei überladene Versionen einer Funktion habe, die sich nur darin unterscheiden, dass die eine const ist und eine konstante Referenz zurückgibt während die andere nicht const ist und eine (nicht konstante) Referenz zurückgibt, woher weiß ich dann, welche aufgerufen wird?

    Z.B. Indexoperator:

    T&             operator [] (int);
    const T&       operator [] (int) const;
    

    In Fällen, wo die "non-const" Variante zwingend erforderlich ist, ist das natürlich eindeutig:

    myVar[0] = 17;
    

    Aber wie ist das beispielsweise bei

    if (myVar[0] == 17)
    

    Kann man sich hier sicher sein, dass die const-Variante aufgerufen wird?

    Ich hoffe, das ist keine allzu blöde Frage und mich kann jemand aufklären.



  • Es wird immer die non-const Variante aufgerufen, es sei denn du rufst die Methode auf einem als const qualifizierten Objekt, über eine Referenz auf ein const qualifiziertes Objekt oder über einen Pointer auf ein const qualifiziertes Objekt auf. (Dann ist this nämlich const. :))



  • Die non-const Variant wird immer dann aufgerufen, wenn das Objekt, auf dem sie arbeitet, nicht const ist. (d.h. *this ist nicht const). Die const Variant wird aufgerufen, wenn das Objekt konstant ist.

    Beispiel:

    class Var {
      public:
        void foo() { std::cout << "Non-const.\n"; }
        void foo() const { std::cout << "Const.\n"; }
    };
    
    int main() {
      Var myNonConstVar;
      Var const myConstVar;
      myNonConstVar.foo();
      myConstVar.foo();
    }
    


  • Also nur dann, wenn auch tatsächlich die Notwendigkeit besteht (weil this const ist). Da hätte ich vielleicht auch selbst drauf kommen können 🤡

    Trotzdem vielen Dank!


Anmelden zum Antworten