Да, ваш код верен, вот пошаговое описание того, что происходит в вашей SetX(...)
функции
void SetX(Test& test)
{ // Start a scope
int x = 2; // Create a local variable on the stack named x, set it's value to 2
test.setX(x); // Pass the local variable by value (does a copy) to the member function setX(...)
} // Deallocate stack variables in this scope (local variable x deallocated here)
Итак, в итоге вашей локальной переменной x
перед присвоением значения (2) передается по значению в setX(...)
в качестве аргумента, что означает, что значение x
копируется в переменную параметра x
в этом коде:
void setX(const int x) {m_x=x;}
Решение вашей проблемы: Что не сработало бы, если бы ваша setX(...)
функция-член взяла и сохранила ссылку на целое число, а не на значение. Это будет означать, что ссылка на освобожденную переменную стека может быть сохранена в вашем классе (несмотря на то, что она больше не существует).
class Test
{
public:
void setX(int& x) {m_x=x;} // Notice the & for reference
...
private:
int& m_x; // Notice the & for reference
}