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.

38
demandé sur songyuanyao 2018-05-03 13:23:36

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.

64
répondu songyuanyao 2018-05-04 02:57:33

Il est initialisé qu'une seule fois.

const int k = 666;

si non prévu dans le constructeur.

8
répondu Jarod42 2018-05-03 10:26:00