En C++ marquage d'une fonction membre const
signifie qu'il peut être appelé sur const
des cas. Java n'a pas d'équivalent à ce. E. g.:
class Foo {
public:
void bar();
void foo() const;
};
void test(const Foo& i) {
i.foo(); //fine
i.bar(); //error
}
Les valeurs peuvent être affectées à une, plus tard, en Java, par exemple:
public class Foo {
void bar() {
final int a;
a = 10;
}
}
est légal en Java, mais pas du C++ alors que:
public class Foo {
void bar() {
final int a;
a = 10;
a = 11; // Not legal, a has already been assigned a value.
}
}
En Java et en C++ variables de membre peuvent être final
/const
respectivement. Ces le besoin d'être donné une valeur à la fois une instance de la classe est fini d'être construit.
En Java, ils doivent être définis avant que le constructeur a terminé, il peut être atteint de deux façons:
public class Foo {
private final int a;
private final int b = 11;
public Foo() {
a = 10;
}
}
En C++, vous aurez besoin d'utiliser l'initialisation des listes de donner des const
des membres d'une valeur:
class Foo {
const int a;
public:
Foo() : a(10) {
// Assignment here with = would not be legal
}
};
En Java final peut être utilisé pour marquer des choses comme des non-substituables. C++ (avant C++11) ne pas faire cela. E. g.:
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
Mais en C++:
class Bar {
public:
virtual void foo() const {
}
};
class Error: public Bar {
public:
// Fine in C++
virtual void foo() const {
}
};
ce qui est bien, parce que la sémantique de marquage d'une fonction membre const
sont différentes. (Vous pouvez aussi la surcharge en ayant seulement l' const
sur l'une des fonctions membres. (Note également que le C++11 permet des fonctions de membre pour être marqué en finale, voir le C++11 mise à jour de l'article)
C++11 mise à jour:
C++11 dans les faits, vous permettent de marquer les deux classes et fonctions de membre en tant que final
, à l'identique de la sémantique de la même fonction en Java, par exemple en Java:
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
Peut maintenant être exactement écrit en C++11:
class Bar {
public:
virtual void foo() final;
};
class Error : public Bar {
public:
virtual void foo() final;
};
J'ai dû compiler cet exemple, avec une pré-version de G++ 4.7. Notez que ceci ne remplace pas l' const
dans ce cas, mais plutôt il augmente, en fournissant le Java comme un comportement qui n'a pas été vu avec l'équivalent le plus proche de C++ mot-clé. Donc si vous voulez une fonction membre pour être à la fois final
et const
vous ne:
class Bar {
public:
virtual void foo() const final;
};
(L'ordre de const
et final
ici est requis).
Auparavant il n'y avait pas d'équivalent direct de l' const
fonctions de membre de bien que les fonctions non-virtual
serait une option mais sans provoquer une erreur au moment de la compilation.
De même, le Java:
public final class Bar {
}
public class Error extends Bar {
}
devient en C++11:
class Bar final {
};
class Error : public Bar {
};
(Précédemment private
constructeurs était probablement le plus proche, vous pouvez arriver à cela en C++)
Il est intéressant de noter, dans le but de maintenir la compatibilité avec des pré-C++11 code final
n'est pas un mot clé dans la manière habituelle. (Prendre le trivial, juridique C++98 exemple struct final;
de voir pourquoi en faire un mot-clé serait le code de saut)