unarios sobrecargar sobrecarga relacionales poo operadores operador miembros estaticos c++ c++11 initialization const initializer-list

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.