2 votes

Problème du mot-clé constexpr avec les classes

J'ai récemment vu cet extrait sur Internet :

class Human
{
    int age;

public:
    constexpr Human(int humansAge) : age(humansAge) {}
    constexpr int GetAge() const { return age; }
};

int main(int argc, char const *argv[])
{
    constexpr Human somePerson(15);
    const int hisAge = somePerson.GetAge();

    return 0;
}

Maintenant, j'ai comparé cette classe avec et sans le mot-clé constexpr sur l'explorateur de compilateur et j'ai vu que le constructeur n'avait pas ses instructions sur le côté droit, mais la fonction GetAge Je les ai eus. Maintenant, j'ai quelques questions :

  1. ¿Qué es? constexpr faire ici au constructeur et à la fonction GetAge ?
  2. Quel est le rôle de la const après le prototype de GetAge(), cela signifie-t-il que l'âge sera renvoyé comme une constante ?
  3. Que se passe-t-il si je déclare int hisAge comme n'étant pas un gendarme ?

Merci d'avance.

2voto

Jasper Kent Points 163

Il y a deux questions distinctes ici : const y constexpr .

Commençons par const en enlevant le constexpr .

class Human
{
    int age;

public:
    Human(int humansAge) : age(humansAge) {}
    int GetAge() const { return age; }
};

int main(int argc, char const *argv[])
{
    Human somePerson(15);
    const int hisAge = somePerson.GetAge();

    return 0;
}

Le site const sur GetAge() déclare qu'appeler GetAge() ne changera pas l'état de l'objet. Ainsi, si nous essayons d'écrire :

int GetAge() const { return ++age; }

cela provoquerait une erreur de compilation, qui n'existerait pas sans l'option const .

La contrainte sur hisAge :

const int hisAge = ...

dit simplement que hisAge ne peut pas être modifié après avoir été initialisé, de sorte qu'une nouvelle version de

hisAge = 50;

serait illégale.

Cependant, tous ces éléments sont des constantes d'exécution. Bien que nous ayons initialisé human avec une constante de type 15 Cela aurait également fonctionné avec une valeur lue par l'utilisateur ou un fichier.

Si nous réintroduisons tous les constexpr cela signifie que nous avons maintenant des constantes au moment de la compilation. Nous pouvons avoir plusieurs humains avec des âges différents, mais tous les âges doivent être disponibles au moment de la compilation, c'est-à-dire codés en dur.

1voto

apple apple Points 2470

1 . Le spécificateur constexpr déclare que c'est possible pour évaluer la valeur de la fonction ou de la variable au moment de la compilation. -- Référence cpp .

Je dirais qu'il ne fait rien dans votre exemple.


2 . constexpr int GetAge() const { return age; }

que const signifie quelque chose comme this es const Human ( const Human this <=> const int x )


3 . Que se passe-t-il si je déclare int hisAge comme n'étant pas un const ?

Ça ne changerait rien. .


const es casi un indice, il vous aide (en tant que programmeur) à écrire du code de const-correctness, vous empêche de modifier involontairement l'état. Cela peut changer l'emplacement de la variable ou une certaine optimisation du compilateur, mais vous ne remarquerez probablement pas la différence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X