Quelle est la signification de const
dans de telles déclarations? Le const
me confond.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
la source
Quelle est la signification de const
dans de telles déclarations? Le const
me confond.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
Lorsque vous ajoutez le const
mot - clé à une méthode, le this
pointeur devient essentiellement un pointeur vers un const
objet et vous ne pouvez donc pas modifier les données de membre. (Sauf si vous utilisez mutable
, plus à ce sujet plus tard).
Le const
mot-clé fait partie de la signature des fonctions, ce qui signifie que vous pouvez implémenter deux méthodes similaires, une qui est appelée lorsque l'objet l'est const
et une qui ne l'est pas.
#include <iostream>
class MyClass
{
private:
int counter;
public:
void Foo()
{
std::cout << "Foo" << std::endl;
}
void Foo() const
{
std::cout << "Foo const" << std::endl;
}
};
int main()
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
}
Cela produira
Foo
Foo const
Dans la méthode non const, vous pouvez modifier les membres de l'instance, ce que vous ne pouvez pas faire dans la const
version. Si vous changez la déclaration de méthode dans l'exemple ci-dessus par le code ci-dessous, vous obtiendrez des erreurs.
void Foo()
{
counter++; //this works
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; //this will not compile
std::cout << "Foo const" << std::endl;
}
Ce n'est pas tout à fait vrai, car vous pouvez marquer un membre comme mutable
et une const
méthode peut ensuite le modifier. Il est principalement utilisé pour les compteurs internes et autres. La solution pour cela serait le code ci-dessous.
#include <iostream>
class MyClass
{
private:
mutable int counter;
public:
MyClass() : counter(0) {}
void Foo()
{
counter++;
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; // This works because counter is `mutable`
std::cout << "Foo const" << std::endl;
}
int GetInvocations() const
{
return counter;
}
};
int main(void)
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
std::cout << "Foo has been invoked " << ccc.GetInvocations() << " times" << std::endl;
}
qui produirait
Foo
Foo const
Foo has been invoked 2 times
Le const signifie que la méthode promet de ne modifier aucun membre de la classe. Vous seriez en mesure d'exécuter les membres de l'objet qui sont ainsi marqués, même si l'objet lui-même était marqué const
:
const foobar fb;
fb.foo();
serait légal.
Voir Combien et quelles sont les utilisations de «const» en C ++? pour plus d'informations.
Le const
qualificatif signifie que les méthodes peuvent être appelées sur n'importe quelle valeur de foobar
. La différence survient lorsque vous envisagez d'appeler une méthode non const sur un objet const. Vérifiez si votre foobar
type a la déclaration de méthode supplémentaire suivante:
class foobar {
...
const char* bar();
}
La méthode bar()
est non const et n'est accessible qu'à partir de valeurs non const.
void func1(const foobar& fb1, foobar& fb2) {
const char* v1 = fb1.bar(); // won't compile
const char* v2 = fb2.bar(); // works
}
L'idée derrière const
est cependant de marquer des méthodes qui ne modifieront pas l'état interne de la classe. Il s'agit d'un concept puissant mais qui n'est pas réellement applicable en C ++. C'est plus une promesse qu'une garantie. Et celui qui est souvent cassé et facilement cassé.
foobar& fbNonConst = const_cast<foobar&>(fb1);
const
est de marquer des méthodes qui ne modifieront pas l'état interne de la classe". C'est vraiment ce que je cherchais.const
?Ces const signifient que le compilateur générera une erreur si la méthode «avec const» modifie les données internes.
Le test
Lisez ceci pour plus d'informations
la source
const
les fonctions membres qui ne mentionne pas mutable est au mieux incomplète.La réponse de Blair est dans le mille.
Notez toutefois qu'il existe un
mutable
qualificatif qui peut être ajouté aux membres de données d'une classe. Tout membre ainsi marqué peut être modifié dans uneconst
méthode sans violer leconst
contrat.Vous pouvez utiliser ceci (par exemple) si vous voulez qu'un objet se souvienne combien de fois une méthode particulière est appelée, sans affecter la constance "logique" de cette méthode.
la source
Signification d'une fonction membre Const en C ++ Connaissance courante: la programmation intermédiaire essentielle donne une explication claire:
Donc dans votre code:
Vous pouvez le penser comme ceci:
la source
this
ne l'est pasconst
. La raison pour laquelle il ne peut pas être modifié est qu'il s'agit d'une valeur.lorsque vous utilisez
const
dans la signature de méthode (comme votre dit:) vous ditesconst char* foo() const;
au compilateur que la mémoire pointée parthis
ne peut pas être modifiée par cette méthode (qui estfoo
ici).la source
Je voudrais ajouter le point suivant.
Vous pouvez également en faire un
const &
etconst &&
Donc,
N'hésitez pas à améliorer la réponse. Je ne suis pas un expert
la source
*this
est toujours une valeur l, même si la fonction membre est qualifiée rvalue-ref et est appelée sur une valeur r. Exemple .Le mot clé const utilisé avec la déclaration de fonction spécifie qu'il s'agit d'une fonction membre const et qu'il ne pourra pas modifier les membres de données de l'objet.
la source
https://isocpp.org/wiki/faq/const-correctness#const-member-fns
la source