sobrecargar - sobrecarga del operador<< c++
¿Por qué se podría inicializar el miembro const dos veces? (2)
A continuación se muestra un fragmento de código que podría compilarse y ejecutarse sin error en 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 salida es de 555
. Pero, por lo que sé, el objeto const
debe inicializarse solo una vez, después de lo cual el valor es inmodificable.
No se inicializa dos veces; el inicializador de miembro predeterminado simplemente se ignora. Así para A a(555);
, ak
se inicializa como 555
.
Si un miembro tiene un inicializador de miembro predeterminado y también aparece en la lista de inicialización de miembro en un constructor, el inicializador de miembro predeterminado se ignora.
De la norma, [class.base.init]/10 :
Si un miembro de datos no estáticos dado tiene un inicializador de miembro predeterminado y un inicializador de mem, se realiza la inicialización especificada por el inicializador de mem y se ignora el inicializador de miembro predeterminado del miembro de datos no estáticos. [Ejemplo: Dado
struct A { int i = /* some integer expression with side effects */ ; A(int arg) : i(arg) { } // ... };
el constructor A (int) simplemente inicializará i con el valor de arg, y los efectos secundarios en el inicializador de miembro predeterminado de i no tendrán lugar. - ejemplo final]
Por otro lado, dado
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;
};
entonces para A a;
, ak
se inicializará como 666
.
Se inicializa solo una vez.
const int k = 666;
sería utilizado si no se proporciona en el constructor.