J'apprends toujours sur C++ et je lis partout où je dois utiliser const
partout où je peux (pour des raisons de vitesse je pense).
J'écris généralement ma méthode getter comme ceci:
const bool isReady() {
return ready;
}
Mais j'ai vu que certains IDE getter de génération automatique de cette manière:
bool getReady() const {
return ready;
}
Mais, en écrivant des délégués, il m'est arrivé de trouver cette erreur si le const
est après la fonction:
member function 'isReady' not viable: 'this' argument has type 'const VideoReader', but function is not marked const
Alors, quelle est la meilleure façon d'écrire un getter const? Dois-je vraiment m'en soucier?
Il y a une énorme différence entre les deux façons.
const bool isReady()
Le code ci-dessus renverra un const bool
, mais cela ne garantit pas que l'objet ne changera pas son état logique.
bool isReady() const
Cela renverra un bool
, et cela garantit que l'état logique de votre objet ne changera pas. Dans ce cas, il n'est pas nécessaire d'écrire const
devant le type de retour. Cela n'a aucun sens de renvoyer un const bool
car c'est quand même une copie. Donc, le faire const
est inutile. Le second const
est nécessaire pour const
correction , qui n'est pas utilisé pour des raisons de vitesse mais pour rendre votre programme plus fiable et plus sûr.
Ils signifient deux choses différentes:
const bool isReady() {
return ready;
}
Cela renvoie un booléen constant. Cela signifie un bool qui ne peut pas changer de valeur à partir du moment où il a été créé.
bool getReady() const {
return ready;
}
Il s'agit d'une fonction constante, c'est-à-dire d'une fonction qui ne modifiera aucune variable membre de la classe à laquelle elle appartient. C'est le style recommandé pour les getters, car leur seul but est de récupérer des données et ne devrait rien modifier dans le processus.
La méthode const
informe le compilateur que vous ne modifierez pas l'instance de classe sur laquelle cette méthode est appelée:
class A {
public:
bool getReady() const {
return ready;
}
};
donc si vous essayez de modifier votre objet dans getReady (), le compilateur émettra une erreur. Les méthodes const sont utiles là où vous avez ie: const A &, ou const A *, alors vous ne pouvez appeler que des méthodes const sur de tels objets.
pour ce qui est de:
const bool isReady() {
return ready;
}
cette const n'offre en fait aucun avantage réel, car bool est copié pendant le retour de isReady (). Un tel const
qui aurait du sens si le type retourné était un const char*
ou const A&
, dans de tels cas const
rend votre chaîne de caractères ou une instance de classe A immuable.
Un const getter a la signature
bool getReady() const
L'autre version n'est pas une méthode const
, elle renvoie juste une valeur const
(qui est fondamentalement inutile).
Avoir un getter const
vous permet de l'appeler sur des objets const:
const Object obj;
obj.getReady();
Ceci n'est valable que si getReady
est marqué comme const
.
Il existe une différence entre l'utilisation du mot clé const
pour le type de retour ou pour la signature de la méthode. Dans le premier cas, la valeur renvoyée sera une valeur constante. Dans le second cas, la méthode sera une méthode dite constante, qui ne peut pas modifier la représentation de l'objet. Sur les objets constants, seules les méthodes constantes sont appelables.