我遇到過有關使用參考數據成員的示例源代碼,我對輸出感到困惑。這裏是示例代碼。指向堆棧變量的參考(&)數據成員的行爲
class Test {
private:
int &t;
public:
Test (int y):t(y) { }
int getT() { return t; }
};
int main() {
int x = 20;
Test t1(x);
cout << t1.getT() << "\n"; // Prints 20 as output. however y has already been destroyed but still prints 20.
x = 30;
cout << t1.getT() << endl; // Prints Garbage as output Why ? Ideally both steps should be Garbage.
return 0;
}
而爲更混亂添加這裏是同一類
int main() {
int x = 20;
int z = 60;
Test t1(x);
Test t2(z);
cout<<t1.getT()<<"\n"; // Prints 60! WHY? Should print garbage
cout<<t2.getT() << "\n"; // Prints Garbage
cout<<t1.getT() << endl; // Prints Same Garbage value as previous expression
return 0;
}
實際上,我關心的是在y的內存地址上刷新值的時間。在第一個getT語句中,它打印已經被銷燬的地址的值,但仍然打印一些不是垃圾值的值。 – Tejendra
'getT()'會導致未定義的行爲(不只是「返回一個未定義的值」) - 任何事情都可能發生 –
我已經添加了第三段,其中包含一些關於未定義行爲的細節。值得指出的是,在你的例子中,第一個getT()似乎工作,但它仍然是未定義的 - 如果你運行它1000次或運行在另一個操作系統上,你可能會得到不同的結果! – youngthing