Re: [問題] C++宣告物件的問題

看板C_and_CPP作者 (Aider)時間12年前 (2012/01/23 16:54), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
: 原文吃光光 java 的物件與 c++ 的物件操作的不同 小弟在此可能也無法完全舉出 有勞高手補充 照原 PO 的需求就從 java 的觀點往 c++ 推進好了 (c++ 往 java 個人覺得比較容易) Java 中唯一產生新物件 Foo 的方法只有 new Foo( ... ) //...為參數 故 Foo f; 這樣的式子是不會產生新物件的 產生的只是一個可以指向 Foo 物件的 f 與內建型別 int, double... 等等的相當不同 內建型別 int n = 3; 那 n 就唯一享有一塊記憶體位置,無法用任何方式與其他人分享 要分享的話要用物件化的 Integer ,這的操作就跟 Foo 物件一樣了 而 java 的物件可以用的運算子只有 = (不確定是不是只有 內建型別視情況可以 +, -, *, /, ==, !=, ... 而且兩者的 = 有很大的差異 舉例說明之: int n, m = 3; n = m; //n == 3, m == 3 ++n; //n == 4, m == 3 也就是 pass by value Foo f1, f2 = new Foo( "test" ); f1 = f2; //兩者指到同一個 Foo f1.changeWord( "change" ); //f1.word() == f2.word() == "change" 注意因為只有一個 new,所以只有一個新的物件產生 而 f1, f2 都是指向同一個物件,所以在 f1, f2 上做改變的操作是一樣的 好了複習完 java 來看看 c++ 吧 c++ 可以當作沒有區分內建型別跟物件型別 大家都是一樣的 在 c++ 新增一個物件有三種方法 第一種與 java 內建型別方式一樣 int n = 3; 或 int n(3); Foo f(...); 或 Foo f1 = f2; //...為參數,f2 是另一個 Foo 物件 第二種與 java 物件型別一樣,不過接收的不是 Foo 而是 Foo 的指標 int* n = new int(3); //新建一個 int 型別 Foo* f = new Foo(...); //新建一個 Foo 型別 或要用 reference 接也是可以啦XD int& n = *( new int(3) ); //最白癡的用法? Foo& f = *( new Foo(...) ); 第三種是 java 沒有的,也是一個暫時物件的產生法 int n = int(3); //產生一個暫時的 int 初值為 3 傳值給 n 後銷毀 Foo f = Foo(...); //產生一個暫時的 Foo 傳值給 f 後就自己銷毀 這三種產生的都是新物件,而不是參照或指標之類的 它們在記憶體的位置有差,不過不是這裡強調的 而最像 java 物件用法的應該是指標 Foo* Foo* f1, f2 = new Foo(...); f1 = f2; //f1, f2 指向同一個物件 f1->changeWord(...) //f1, f2 同時改 f1 = NULL; //f1 指標指向記憶體第 0 格,也就是不指向物件 發現了嗎? java 物件的 . 在此被改成像箭頭的符號 -> 這是在 c++ 中 指標物件存取成員的方法 要注意的是, c++ 並沒有自動垃圾回收處理機制 所以 new 出的一個物件要手動用 delete 把它殺掉 一個 new 配上一個 delete 所以上述執行完要再執行 delete f2; 這行 其他方式建構的不需要刪,他會像 java 內建型別一樣在離開 { }(block) 後自行銷毀 而一般物件 Foo f1, f2(...); f1 = f2; //f1, f2 值一樣但不互相參照 f1.changeWord(...); //f2 沒被改 f1 = NULL; //錯誤,無法從指標型別轉型為 Foo 型別 c++ 的 . 在此是對一般型別使用的 最後還有第三種兩種折衷的 參照型別 Foo f1(...); Foo& f2 = f1; //f2 是 f1 的別名 //注意 f2 不能再是別人的別名了 //令出來的當下那個 = 就叫決定是誰的別名 //不決定會有錯 //此行之後就把 f2 當作一個 f1 看 //包函 = 運算子 Foo f3(...); f2 = f3; //同一般物件,值一樣但 f2, f3 不互相參照 //此時 f1, f2 互相參照且值與 f3 相同 f3.changeWord(...); //f3 更改,f1, f2 不變 而 c++ 可以自定義 +, -, *, / 等等...的運算子 所以物件也可以有自己的運算子 所以我看待物件與看待基礎型別有些狀況下是沒差的(蠻多狀況還是有差XD 而 Test* t = NULL; *t = Test(n); 會失敗是因為 你的 t 指到不能產生物件的記憶體位置 0 你卻硬要再上面更改 正確應該先讓系統分配記憶體 Test* t = new Test(); *t = Test(n); 這樣 t 指到的地方才不會是不可改的 記得要 delete 喔 歡迎討論 以上 by Aider -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 182.235.36.249 ※ 編輯: WJAider 來自: 182.235.36.249 (01/23 17:12)

01/24 16:13, , 1F
嗯嗯~謝謝指導~看來我的C++概念還很不扎實
01/24 16:13, 1F
文章代碼(AID): #1F7I0ymw (C_and_CPP)
文章代碼(AID): #1F7I0ymw (C_and_CPP)