iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
Software Development

用C++ 設計程式中的系統櫃系列 第 5

[Day 05] 用C++ 設計程式中的系統櫃:神奇的箭號

  • 分享至 

  • xImage
  •  

學習物件導向時,你一定常常看到 . 這個符號。

當物件導向遇到指標時,你又一定看過 -> 這個符號!

許多人常常把 ->. 混淆,不知該用哪個符號來正確存取物件屬性。

解答這個問題就是今天的目標。

// 我們就以這個類別來解釋這兩個符號吧。
class Box {
public:
    std::string name;
    int capacity;
};

靜/動態記憶體

int main() {
    Box book = Box();
    book.name = "book";
    book.capacity = 120;
}

我們要賦予物件屬性數值,習慣且直覺上會使用 . 來呼叫物件屬性。
以這份程式碼來說,確實是正確的。

再換一個例子!

int main() {
    Box book = Box();
    book -> name = "book";  // Error
    book -> capacity = 120; // Error
}

編譯器報出了 2 個錯誤:

error: member reference type 'Box' is not a pointer; 
        did you mean to use '.'?
    book -> name = "book"; 
    ~~~~ ^~
         .
error: member reference type 'Box' is not a pointer; 
        did you mean to use '.'?
    book -> capacity = 120;
    ~~~~ ^~
         .

看完兩個例子,可能我們還沒有什麼感覺!
但是我們可以確定

  1. 上述的物件都是建立在靜態記憶體之上。(先記起來,等一下會用到)
  2. 根據錯誤訊息,只有指標能搭配使用 ->

現在就來試試使用動態配置記憶體建立物件變數吧!

int main() {
    Box *book = new Box();
    book.name = "book";
    book.capacity = 120;
}

編譯器報出了 2 個錯誤:

error: member reference type 'Box *' is a pointer;
      did you mean to use '->'?
    book.name = "book"; 
    ~~~~^
        ->
error: member reference type 'Box *' is a pointer;
      did you mean to use '->'?
    book.capacity = 120;
    ~~~~^
        ->

我們稍微改變寫法,改為使用 ->

int main() {
    Box *book = new Box();
    book -> name = "book";
    book -> capacity = 120;
}

這次我們就編譯成功,代表這個語法是正確的!


中場休息

我們得出了兩個結論:

  1. . 搭配靜態記憶體中的變數
  2. -> 搭配動態記憶體中的變數,又因為動態記憶體以指標出現,所以 -> 也可以說是搭配指標。

解密 . & ->

先解釋 . ,他是用來存取物件的屬性

那要怎麼搭配 . 來存取動態記憶體的物件呢?
做法大致為:

  1. 對指標取值,得到這塊記憶體的物件內容
  2. 既然得到物件了,那我們就可以對他做屬性存取
int main() {
    Box *book = new Box();
    (*book).name = "book";
    (*book).capacity = 120;
}

但是這樣顯得特別冗長,所以我們將它縮寫為 ->

int main() {
    Box *book = new Box();
    book -> name = "book";
    book -> capacity = 120;
}

結論

  • 存取靜態配置記憶體的物件:使用 .
  • 存取動態配置記憶體的物件:
    1. 先取值,再取屬性
    2. 使用 ->

接下來,就從鏈結串列來認識資料結構吧!


上一篇
[Day 04] 用C++ 設計程式中的系統櫃:動態配置記憶體
下一篇
[Day 06] 用C++ 設計程式中的系統櫃:鏈結串列概論
系列文
用C++ 設計程式中的系統櫃30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言