In C ++ bedeutet das Markieren einer Mitgliedsfunktion, const
dass sie für const
Instanzen aufgerufen werden kann. Java hat kein Äquivalent dazu. Z.B:
class Foo {
public:
void bar();
void foo() const;
};
void test(const Foo& i) {
i.foo(); //fine
i.bar(); //error
}
Werte können später in Java nur einmal zugewiesen werden, z.
public class Foo {
void bar() {
final int a;
a = 10;
}
}
ist in Java legal, aber nicht in C ++, wohingegen:
public class Foo {
void bar() {
final int a;
a = 10;
a = 11; // Not legal, even in Java: a has already been assigned a value.
}
}
Sowohl in Java als auch in C ++ können Mitgliedsvariablen final
/ sein const
. Diese müssen einen Wert erhalten, wenn eine Instanz der Klasse fertig erstellt ist.
In Java müssen sie festgelegt werden, bevor der Konstruktor fertig ist. Dies kann auf zwei Arten erreicht werden:
public class Foo {
private final int a;
private final int b = 11;
public Foo() {
a = 10;
}
}
In C ++ müssen Sie Initialisierungslisten verwenden, um const
Mitgliedern einen Wert zu geben :
class Foo {
const int a;
public:
Foo() : a(10) {
// Assignment here with = would not be legal
}
};
In Java kann final verwendet werden, um Dinge als nicht überschreibbar zu markieren. C ++ (vor C ++ 11) tut dies nicht. Z.B:
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
Aber in C ++:
class Bar {
public:
virtual void foo() const {
}
};
class Error: public Bar {
public:
// Fine in C++
virtual void foo() const {
}
};
Dies ist in Ordnung, da die Semantik des Markierens einer Elementfunktion const
unterschiedlich ist. (Sie können auch überladen, indem Sie nur const
eine der Elementfunktionen verwenden. (Beachten Sie auch, dass in C ++ 11 Elementfunktionen als endgültig markiert werden können, siehe Abschnitt zum Aktualisieren von C ++ 11).
C ++ 11 Update:
In C ++ 11 können Sie tatsächlich sowohl Klassen als auch final
Elementfunktionen mit identischer Semantik für dasselbe Feature in Java markieren , z. B. in Java:
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
Kann jetzt in C ++ 11 genau wie folgt geschrieben werden:
class Bar {
public:
virtual void foo() final;
};
class Error : public Bar {
public:
virtual void foo() final;
};
Ich musste dieses Beispiel mit einer Vorabversion von G ++ 4.7 kompilieren. Beachten Sie, dass dies const
in diesem Fall nicht ersetzt , sondern erweitert wird, indem das Java-ähnliche Verhalten bereitgestellt wird, das mit dem nächstgelegenen entsprechenden C ++ - Schlüsselwort nicht angezeigt wurde. Also , wenn Sie wollten beide eine Member - Funktion sein final
und const
Sie tun würden:
class Bar {
public:
virtual void foo() const final;
};
(Die Reihenfolge von const
und final
hier ist erforderlich).
Bisher gab es kein direktes Äquivalent zu const
Mitgliedsfunktionen, obwohl virtual
es eine potenzielle Option wäre , Funktionen nicht zu machen, ohne jedoch beim Kompilieren einen Fehler zu verursachen.
Ebenso das Java:
public final class Bar {
}
public class Error extends Bar {
}
wird in C ++ 11:
class Bar final {
};
class Error : public Bar {
};
(Bisher waren private
Konstruktoren wahrscheinlich die nächsten, die Sie in C ++ erreichen konnten.)
Interessanterweise ist zur Aufrechterhaltung der Abwärtskompatibilität mit Code vor C ++ 11 final
kein Schlüsselwort in der üblichen Weise. (Nehmen Sie das triviale, legale C ++ 98-Beispiel, um struct final;
zu sehen, warum das Erstellen eines Schlüsselworts den Code beschädigen würde.)