「c語言箭頭運算子」的推薦目錄:
- 關於c語言箭頭運算子 在 コバにゃんチャンネル Youtube 的最佳貼文
- 關於c語言箭頭運算子 在 大象中醫 Youtube 的精選貼文
- 關於c語言箭頭運算子 在 大象中醫 Youtube 的最佳貼文
- 關於c語言箭頭運算子 在 Re: [問題] C++宣告物件的問題- 看板C_and_CPP - 批踢踢實業坊 的評價
- 關於c語言箭頭運算子 在 【C 語言入門】23.4- 指標與下標運算子 - YouTube 的評價
- 關於c語言箭頭運算子 在 c語言->2023-在Facebook/IG/Youtube上的焦點新聞和熱門話題 ... 的評價
- 關於c語言箭頭運算子 在 c語言->2023-在Facebook/IG/Youtube上的焦點新聞和熱門話題 ... 的評價
c語言箭頭運算子 在 大象中醫 Youtube 的精選貼文
c語言箭頭運算子 在 大象中醫 Youtube 的最佳貼文
c語言箭頭運算子 在 【C 語言入門】23.4- 指標與下標運算子 - YouTube 的美食出口停車場
【 C 語言 入門】23.4- 指標與下標 運算子. 23K views · 6 years ago ...more. Feis Studio. 57.3K. Subscribe. 57.3K subscribers. 244. Share. Save. ... <看更多>
c語言箭頭運算子 在 c語言->2023-在Facebook/IG/Youtube上的焦點新聞和熱門話題 ... 的美食出口停車場
相同點:兩者都是二元操作符,而且右邊的運算元都是成員的名稱。 不同點:點運算子( . )的左邊運算元是一個結果為結構的表示式; 箭頭運算子( -> )的 ... ... <看更多>
c語言箭頭運算子 在 Re: [問題] C++宣告物件的問題- 看板C_and_CPP - 批踢踢實業坊 的美食出口停車場
: 原文吃光光
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)
... <看更多>