Существует альтернативный синтаксис инициализации членов классов используя так называемый список инициализации, в котором через запятую указываются имена и начальные значения. Например, конструктор по умолчанию можно переписать следующим образом:
// конструктор по умолчанию класса Test с использованием
// списка инициализации членов int member1, double member2, int member3
// списка инициализации членов int member1, double member2, int member3
inline Test:: Test() : member1(0), member2( 0.0 ), member3( 0 ) {};
Такой список допустим только в определении, но не в объявлении конструктора. Он помещается между списком параметров и телом конструктора и отделяется двоеточием. Вот как выглядит конструктор с двумя параметрами при частичном использовании списка инициализации членов:
inline Test:: Test(int m1, double m2, int m3) : member1(m1), member2(m2), member3(m3) {};
Важно помнить о соблюдении порядка объявления членов, которые мы хотим инициализировать через список в конструкторе: порядок объявления должен быть равнозначен порядку инициализации, например:
class Test {
// Порядок объявления членов класса
int b;
int a;
public:
public:
Test(int x) : a(x), b(a) {}; // Нарушен порядок
};
При этом компилятор может не проругаться, однако переменные будут содержать неоднозначные значения (мягко говоря). На последок небольшой рабочий пример.
#include <iostream>
using namespace std;
class Test {
int a;
int b;
int b;
public: Test() : a(16), b(61) {};
//Test(int x) : a(x), b(a) {}; // Нарушен порядок
void show() {cout << "a = " << a << " b = " << b << endl;};
//Test(int x) : a(x), b(a) {}; // Нарушен порядок
void show() {cout << "a = " << a << " b = " << b << endl;};
};
int main() {
Test t;
//Test t(5); // Для вызова конструктора с нарушенным поядком объявления и инициализации
t.show();
}
//Test t(5); // Для вызова конструктора с нарушенным поядком объявления и инициализации
t.show();
}