Ответ 1
Он не инициализируется дважды; инициализатор элемента по умолчанию просто игнорируется. Итак, для A a(555);
, ak
инициализируется как 555
.
Если член имеет инициализатор элемента по умолчанию и также появляется в списке инициализации члена в конструкторе, инициализатор элемента по умолчанию игнорируется.
Из стандарта [class.base.init]/10:
Если данный нестатический член данных имеет как инициализатор элемента по умолчанию, так и инициализатор mem, инициализация, указанная mem-инициализатором, выполняется, а инициализатор элемента нестатического элемента данных игнорируется. [Пример: с учетом
struct A { int i = /* some integer expression with side effects */ ; A(int arg) : i(arg) { } // ... };
конструктор A (int) будет просто инициализировать я до значения arg, а побочные эффекты в инициализаторе элемента по умолчанию я не будут иметь места. - конец примера]
С другой стороны, данный
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;
};
то для A a;
, ak
будет инициализирован как 666
.