36 votes

déclarer une instance const d'une classe

Disons que j'ai une classe définie comme suit:

class foo{};

maintenant, ce qui est parfaitement acceptable;

foo f;

comment se fait-c'est une erreur de compilateur? (uninitialized const ‘f')

const foo f;

Pourquoi devons-nous faire cela?

const foo f = foo();

Je sais pourquoi nous ne pouvons pas faire cela..

const foo f(); // though it compiles..

Fait intéressant, le suivant est valide:

const std::string f;

Donc, qu'est-ce que manquant de foo?

Je me rends compte qu'il y a trois questions là et c'est une mauvaise forme, mais je suis en espérant que quelqu'un peut éclaircir ce point pour moi en une seule réponse.

EDIT: n'hésitez pas à la fermer si c'est stupide...

46voto

Konrad Rudolph Points 231505

Votre classe est une GOUSSE (essentiellement parce qu'il ne fournit pas un constructeur par défaut). POD variables ne sont pas initialisées lors de la déclaration. Qu'est ce:

foo x;

ne pas initialiser x à une valeur raisonnable. Cela doit être fait séparément. Maintenant, quand vous la déclarer comme const, cela peut ne jamais se produire parce que vous ne pouvez pas affecter ou de modifier x plus.

Tenir compte de l'équivalence d' int:

int x; // legal
const int y; // illegal

Comme vous l'avez remarqué, à l'aide de std::string au lieu de foo compile. C'est parce qu' std::string n'est pas un POD. Une solution simple à votre dilemme est de fournir un constructeur par défaut pour foo:

class foo {
public:
    foo() { }
};

Maintenant, votre const foo x; code compile.

6voto

Le fait de générer une erreur dans la situation d'une classe vide est un problème connu, signalé sous le numéro 253 .

1voto

Öö Tiib Points 4755

Je pense qu'il y a plus d'alternatives. Tu peux faire

 const foo f={};
 

ou

 const foo f(());
 

Const signifie que vous ne pouvez pas l'affecter plus tard, vous devez donc l'initialiser. Puisque vous n'avez pas défini le constructeur par défaut, le compilateur suppose qu'il doit être initialisé par vous. std :: string a un constructeur par défaut, il est donc appelé implicitement par compilateur.

1voto

Josh Petrie Points 4000

const , appliqué à une simple variable de données anciennes, indique que cette variable ne changera pas dans ce contexte - vous ne pourrez donc pas la réaffecter à quelque chose. Par conséquent, vous devez l’initialiser ou il sera perpétuellement non initialisé et donc inutile.

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