-------------------------------
1. class SA
2. {
3. public:
4. SA()
5. {cout<<"SA construct"<<endl;}
6. ~SA()
7. {cout<<"SA destruct"<<endl;}
8. int i;
9. };
10. int main()
11. {
12. class SA *p=&SA();
13.
14. p->i = 100;
15.
16. cout<
i<<endl;
17.
18. return 0;
19. }
-------------------------------
請問一下,output會是什麼?
我用Turbo C++ 3所編譯出來的結果是:
---------------------
SA construct
SA destruct
100
SA destruct
---------------------
請問一下,
1. 在第12行時呼叫SA()是一個什麼樣的行為?(我知道如果寫成 class SA p=SA();是代表這p這個class的初始化。但不了解12行的行為,有什麼地方會使用這樣的寫法)?
2. 以我的理解中,當第12行作一次SA()時便會同時呼叫SA的construct與destruct,因此代表了這個class的生命週期應該只有在第12行而已。但是我在14、16行分別給值和列印,為什麼這樣的行為還是合法?
3. 為什麼最後又會出現一次的destruct?
在第2個問題的答案 是不是雖然這個p所指到的位址已經被釋放了,但是p仍然會繼續拿來使用,除非程式其他片段有覆蓋到這個位址,所以當我 給值 跟 列印,都只是對已經被釋放的位址做存取,雖然程式邏輯已經錯誤,但仍然可以繼續下去。
感謝 各位先進的回答 ^^
----------------
update 一些錯誤~
----------------
update 2~
感謝各位的回答,
我今天回去重新確認一次程式所執行的結果之後,發現上面我所post出來的是有問題的
結果應改為
SA construct
100
SA destruct
因此,我把我上述的問題與我的推論重新思考過之後一切應該都是合理的^^
在12. class SA *p=&SA();執行時,程式初始化了一塊屬於class SA的記憶體,並且此位址給了p。其後p正常使用這塊記憶體。當程式結束之後便destruct。
其實這個問題是我在網路上看到一個網頁,將其問題簡化過後所post出來討論的,
http://www.evanlin.com/wp/?p=87
第二個問題便是我的問題來源。
但是其實我在這邊又衍生出來了一個問題,
我做了一個小測試
當我把12. class SA *p=&SA();改成
12. class SA *p;
12a. p=&SA();
結果會是
SA construct
SA destruct
100
這好像跟預期的有點不相同 @@
這樣2種寫法的差異會是在哪邊呢??
抱歉困擾各位了 ^^