In C ++ bedeutet das Markieren einer Mitgliedsfunktion, constdass sie für constInstanzen 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 constMitgliedern 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 constunterschiedlich ist. (Sie können auch überladen, indem Sie nur consteine 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 finalElementfunktionen 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 constin 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 finalund constSie tun würden:
class Bar {
public:
virtual void foo() const final;
};
(Die Reihenfolge von constund finalhier ist erforderlich).
Bisher gab es kein direktes Äquivalent zu constMitgliedsfunktionen, obwohl virtuales 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 privateKonstruktoren 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.)