Considérez le code suivant. Il définit une classe Test
avec une variable membre int &m
et une fonction membre Print()
qui imprime la valeur et l'adresse de m
.Comprendre le comportement de cet extrait de code: valeur imprimée et adresse du différentiel int référencé
#include <iostream>
using namespace std;
class Test
{
public:
int &m;
Test(int n);
void Print();
};
Test::Test(int n) : m(n) {};
void Test::Print() {cout << m << "\t" << &m << endl; };
int main()
{
int a = 2;
Test test1(a);
Test test2(a);
test1.Print();
test2.Print();
return 0;
}
Il est sortie est
Printing.... 2 0x7ffd2744cf0c
Printing.... 2 0x7ffd2744cf08
Si je change le constructeur Test(int n)
être les suivants
Test::Test(int n) : m(n) {cout << "Constructing\t" << n << "\t" << &n << endl;};
Je place obtenir
Constructing 2 0x7ffc233ef15c
Constructing 2 0x7ffc233ef15c
Printing.... 2 0x7ffc233ef15c
Printing.... 32597 0x7ffc233ef15c
Pourquoi m
a-t-il la valeur 32597
dans test2
? Je vois que l'adresse de m
est maintenant le même entre les deux Test
objets test1
et test2
mais je ne suis pas sûr pourquoi changer le constructeur à la sortie de la valeur et l'adresse de celui-ci est entrée n
aurait une incidence sur la valeur ou l'adresse de la variable m
qui n
est utilisé pour instancier.
Si dans un code relativement trivial (comme le vôtre) il y a une valeur étrange, vous pouvez être sûr que c'est un comportement indéfini et pas un bug de logique quelque part. – Rakete1111
@ Rakete1111 Ouais, j'ai pensé que c'était un comportement indéfini puisque 'm' dans' test2' est aléatoire quand j'exécute le code. Mais c'est littéralement le premier code C++ que j'ai écrit et je ne comprends pas pourquoi changer 'Test()' rend le comportement indéfini. Ma compréhension est que l'instruction 'cout' ajoutée à' Test() 'ne change pas' n' ou 'm'. Des pensées sur ce qui se passe? – Blackmill
Vous savez, ce n'est pas défini pour une raison. Peut-être que si vous ajoutez 'int a = 9;' à la fin de votre code, votre ordinateur va exploser. Qui sait: P – Rakete1111