學習物件導向時,你一定常常看到 .
這個符號。
當物件導向遇到指標時,你又一定看過 ->
這個符號!
許多人常常把 ->
與 .
混淆,不知該用哪個符號來正確存取物件屬性。
解答這個問題就是今天的目標。
// 我們就以這個類別來解釋這兩個符號吧。
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; ~~~~ ^~ .
看完兩個例子,可能我們還沒有什麼感覺!
但是我們可以確定
->
現在就來試試使用動態配置記憶體建立物件變數吧!
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;
}
這次我們就編譯成功,代表這個語法是正確的!
我們得出了兩個結論:
.
搭配靜態記憶體中的變數->
搭配動態記憶體中的變數,又因為動態記憶體以指標出現,所以 ->
也可以說是搭配指標。.
& ->
先解釋 .
,他是用來存取物件的屬性
那要怎麼搭配 .
來存取動態記憶體的物件呢?
做法大致為:
int main() {
Box *book = new Box();
(*book).name = "book";
(*book).capacity = 120;
}
但是這樣顯得特別冗長,所以我們將它縮寫為 ->
int main() {
Box *book = new Box();
book -> name = "book";
book -> capacity = 120;
}
.
->
接下來,就從鏈結串列來認識資料結構吧!