c++ - parameter - function definition const




Bedeutung von "const" zuletzt in einer C++-Methodendeklaration? (5)

Was bedeutet const in solchen Deklarationen? Die const verwirrt mich.

class foobar
{
  public:
     operator int () const;
     const char* foo() const;
};

Blairs Antwort ist auf der Stelle.

Beachten Sie jedoch, dass es ein mutable Qualifikationsmerkmal gibt, das zu den Datenelementen einer Klasse hinzugefügt werden kann. Jedes so markierte Element kann in einer const Methode geändert werden, ohne den const Vertrag zu verletzen.

Sie können dies beispielsweise verwenden, wenn Sie möchten, dass ein Objekt sich daran erinnert, wie oft eine bestimmte Methode aufgerufen wurde, ohne die "logische" Konsistenz dieser Methode zu beeinflussen.


Das const Qualifikationsmerkmal bedeutet, dass die Methoden für jeden Wert von foobar aufgerufen werden können. Der Unterschied entsteht, wenn Sie eine nichtkonstante Methode für ein konstantes Objekt aufrufen. Überlegen Sie, ob Ihr foobar Typ die folgende zusätzliche Methodendeklaration hatte:

class foobar {
  ...
  const char* bar();
}

Die Methode bar() ist nicht const und kann nur von nicht konstanten Werten aus aufgerufen werden.

void func1(const foobar& fb1, foobar& fb2) {
  const char* v1 = fb1.bar();  // won't compile
  const char* v2 = fb2.bar();  // works
}

Die Idee hinter const besteht darin, Methoden zu markieren, die den internen Zustand der Klasse nicht verändern. Dies ist ein mächtiges Konzept, ist aber in C ++ nicht durchsetzbar. Es ist mehr ein Versprechen als eine Garantie. Und eine, die oft kaputt und leicht kaputt ist.

foobar& fbNonConst = const_cast<foobar&>(fb1);

Diese Konstanten bedeuten, dass der Compiler einen Fehler hat, wenn die Methode 'with const' interne Daten ändert.

class A
{
public:
    A():member_()
    {
    }

    int hashGetter() const
    {
        state_ = 1;
        return member_;
    }
    int goodGetter() const
    {
        return member_;
    }
    int getter() const
    {
        //member_ = 2; // error
        return member_;
    }
    int badGetter()
    {
        return member_;
    }
private:
    mutable int state_;
    int member_;
};

Der Test

int main()
{
    const A a1;
    a1.badGetter(); // doesn't work
    a1.goodGetter(); // works
    a1.hashGetter(); // works

    A a2;
    a2.badGetter(); // works
    a2.goodGetter(); // works
    a2.hashGetter(); // works
}

Lesen Sie this für weitere Informationen


Wenn Sie const in der Methodensignatur verwenden (wie Sie sagten: const char* foo() const; ), sagen Sie dem Compiler, dass der Speicher, auf den er verweist, nicht durch diese Methode geändert werden kann (was foo hier ist).


Bedeutung einer Const-Member-Funktion in C ++ Allgemeinwissen: Die essentielle Intermediate-Programmierung gibt eine klare Erklärung:

Der Typ des this-Zeigers in einer nichtkonstanten Elementfunktion einer Klasse X ist X * const. Das heißt, es ist ein konstanter Zeiger auf ein nicht-konstantes X (siehe Const Pointer und Pointer zu Const [7, 21]). Da das Objekt, auf das es sich bezieht, nicht const ist, kann es geändert werden. Der Typ davon in einer Konst-Member-Funktion einer Klasse X ist const X * const. Das heißt, es ist ein konstanter Zeiger auf eine Konstante X. Da das Objekt, auf das sich dieses bezieht, const ist, kann es nicht geändert werden. Das ist der Unterschied zwischen den Funktionen const und non-const.

Also in deinem Code:

class foobar
{
  public:
     operator int () const;
     const char* foo() const;
};

Du kannst es so denken:

class foobar
{
  public:
     operator int (foobar * const this) const;
     const char* foo(const foobar * const this) const;
};




c++-faq