Ваш код имеет неопределенное поведение, он вообще не должен работать.
Вот проблема
class X {
int& i;
public:
X(int k = 100) : i(k) {}
...
};
k
- это локальная переменная, параметр конструктору. Он больше не существует после выхода из конструктора.
Но ваш код использует ссылку на эту локальную переменную. Таким образом, ваш класс заканчивается ссылкой на объект, который больше не существует. Это неопределенное поведение.
PS Я не уверен, что вы подразумеваете под переменной класса против переменной-члена. Для меня эти термины означают одно и то же. Но какое бы странное поведение вы не видели, оно объясняется неопределенным поведением вашей программы, как описано выше.
PPS Я вижу, переменная класса означает stati c переменная-член, имеет смысл, поэтому игнорируйте предыдущий абзац .