web-dev-qa-db-fra.com

Constante C ++ dans getter

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?

19
nkint

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.

42
mkaes

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.

22
Diana

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.

7
marcinj

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.

3
Luchian Grigore

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.

3
mcserep