Pourquoi le membre du const pourrait-il être initialisé deux fois?
ci-dessous est un extrait de code qui peut être compilé et exécuté sans erreur dans vs2015
#include<iostream>
using namespace std;
class A {
public:
A(int b) :k(b) {}//second time
const int k = 666;//first time
};
int main() {
A a(555);
cout << a.k << endl;
return 0;
}
La sortie est 555
. Mais autant que je sache,const
objet doit être initialisé qu'une seule fois,après quoi la valeur est inmodifiable.
2 réponses
il n'est pas initialisé deux fois; le membre par défaut de l'initialiseur est simplement ignoré. Donc, pour A a(555);
, a.k
est initialisé 555
.
si un membre a un membre par défaut initializer et apparaît aussi dans la liste d'initialisation du membre dans un constructeur, le membre par défaut initializer est ignoré.
à Partir de la norme, [la classe.base.init] / 10:
si un membre de données non statiques donné a à la fois un membre par défaut initialiseur et un mem-initialiseur, l'initialisation spécifié par le mem-initializer est effectué, et le membre de données non statique par défaut membre de l'initialiseur est ignoré. [ Exemple: Donné
struct A { int i = /* some integer expression with side effects */ ; A(int arg) : i(arg) { } // ... };
A(int) constructeur simplement initialiser i à la valeur de arg, et les effets secondaires dans le membre par défaut initialiseur ne prendra pas lieu. fin de l'exemple ]
d'autre part,, étant donné
class A {
public:
A() {} // k will be initialized via default member initializer, i.e. 666
A(int b) :k(b) {} // k will be initialized via member initializer list, i.e. b
const int k = 666;
};
puis A a;
,a.k
sera initialisé 666
.
Il est initialisé qu'une seule fois.
const int k = 666;
si non prévu dans le constructeur.