Переменная Memeber как переменная класса в C ++, как это происходит? - PullRequest
0 голосов
/ 02 мая 2020


У меня проблема. В настоящее время я работаю над небольшим примером на C ++ и не могу понять объяснение. Вот моя проблема:

#include <iostream>
using namespace std;

class X{
int& i ;  /* int i; */

public :
X(int k=100):i(k){ }



X(`const` X& x):i(x.i){}
void setI(int k){i=k;}
int getI(){cout <<"adresse: "<< &i << " Contenue: "<<i<<endl ; return i;}
};

int main(){
int i =7;

X a(i);
a.getI();

a.setI(5);

a.getI();

cout << "the value of i is: " << i << endl;

X b(a);
b.getI();
cout << "the value of i is: " << i << endl;

X c;
c.getI();
a.getI();

return 0;
}

Так что я не понимаю, почему переменная-член i в классе X работает как переменная класса? Я искал в Интернете и обнаружил, что это называется агрегацией и что он используется по некоторым причинам, но я не могу понять, почему это происходит? Как компилятор делает это?

Не могли бы вы объяснить это мне.
Спасибо в предыдущем.

1 Ответ

5 голосов
/ 02 мая 2020

Ваш код имеет неопределенное поведение, он вообще не должен работать.

Вот проблема

class X {
    int& i;
public:
    X(int k = 100) : i(k) {}
    ...
};

k - это локальная переменная, параметр конструктору. Он больше не существует после выхода из конструктора.

Но ваш код использует ссылку на эту локальную переменную. Таким образом, ваш класс заканчивается ссылкой на объект, который больше не существует. Это неопределенное поведение.

PS Я не уверен, что вы подразумеваете под переменной класса против переменной-члена. Для меня эти термины означают одно и то же. Но какое бы странное поведение вы не видели, оно объясняется неопределенным поведением вашей программы, как описано выше.

PPS Я вижу, переменная класса означает stati c переменная-член, имеет смысл, поэтому игнорируйте предыдущий абзац .

...