[程式] 請問一個C++的問題~

有一段程式如下

-------------------------------

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種寫法的差異會是在哪邊呢??

抱歉困擾各位了 ^^

2008-05-11 0:07 發佈
文章關鍵字 程式 C++ 問題
這幾年都在作單晶片,好久沒碰C++了,不知還記得多少

從你以下的輸出來看,解構函式被呼叫二次,看來是有問題
而且class的建構解構程式名稱也打錯了,應和class同名才對

以我以前的記憶回想,只要你有class assign,在某些情況下,compiler會再產生一個臨時
的class來作交換用,即使有new一個臨時class,自然也會有class的生成及毀滅的動作
只是在你這個sample中,這個臨時class只有毀滅的動作,卻沒有建構的動作
那是因為你沒有指定assign的行為定義

你可以再多一個建構函式
SA()::SA(class SA &) {...}

當有臨時物件生成時,compiler會用此來new class

若沒有定義上述的function,compiler會用memory copy的方式來設定class的內容

你可以作個實驗,在class解構時,你cout this,你可以發現,有不同位址的class出現

至於第12行,腦袋昏昏欲睡的,看不出來到底在寫什麼
目前手上沒書,只能針對我的見解跟你說,也不確定對不隊,給你參考。

>>1. 在第12行時呼叫SA()是一個什麼樣的行為?(我知道如果寫成 class SA p=SA();是代表這p這個class的初始化。但不了解12行的行為,有什麼地方會使用這樣的寫法)?
>>2. 以我的理解中,當第12行作一次SA()時便會同時呼叫SA的construct與destruct,因此代表了這個class的生命週期應該只有在第12行而已。但是我在14、16行分別給值和列印,為什麼這樣的行為還是合法?
>>3. 為什麼最後又會出現一次的destruct?

其實你應該不用寫class SA p=SA();應該就可以初始化了,你這樣寫等於宣告兩個class SA
應該可以看成:
class SA A;
class SA *B=&A; <===將A丟給B
這樣看待,雖然你沒有宣告A,但你呼叫了class SA內的function,所以系統會宣告一個臨時的變數來使用。

你個程式可以看成這樣

10. int main()
11. {
class SA tempSA;
12. class SA *p=&tempSA;
13.
14. p->i = 100;
15.
16. cout<<p->i<<endl;
17.
18. return 0;
19. }

結果
---------------------
SA construct tempSA init
SA destruct tempSA free
100
SA destruct p free
---------------------

這裡你或許會問為什麼p沒出始化,可以看成你已經指定出始化*p=&tempSA,所以系統不會幫已初始化。

以上是我的見解,請多多指教

剛拿 NAS01G 跑看看,結果不太一樣

NAS-01G:/home/nas01g/programming# cat test.cpp
#include <iostream>
using namespace std;

class SA
{
public:
SA()
{cout<<"SA construct"<<endl;}
~SA()
{cout<<"SA destruct"<<endl;}
int i;
};

int main()
{
class SA *p=&SA();
p->i = 100;
cout<<p->i<<endl;

return 0;
}

NAS-01G:/home/nas01g/programming# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:16: warning: taking address of temporary

NAS-01G:/home/nas01g/programming# ./a.out
SA construct
SA destruct
100

謝謝各位的回覆~
我盡量吸收各為所提供的意見,雖然有些我仍然不是很懂,但我重新實作之後所得到的結果跟各位的有些出入

to nungchao:
我修改程式所執行出來的結果是
SA construct
100
SA destruct

to phila:
在我重新檢視我的結果之後,在我利用TC++3 編譯後結果是
SA construct
100
SA destruct
會有2種不同編譯程式所造成這不同的結果嗎?
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?