C++點操作符和箭頭操作符
相同點:兩個都是二元操作符,其右操作符是成員的名稱。
主要看左邊的操作符,左邊是指標用箭頭,否則用點操作符
不同點:點操作符左邊的運算元是一個“結果為結構”的表示式;
箭頭操作符左邊的運算元是一個指向結構的指標。
首先介紹一下C++中的結構。對於一個結構來說:
struct MyStruct
{
int member_a;
};
如果有個變數MyStruct s,那麼使用其中的成員元素時可以用
s.member_a = 1;
如果採用指標方法訪問,比如MyStruct * ps,那麼同樣的訪問就必須使用如下形式:
(*ps).member_a = 1;
或者
ps->member_a = 1;
c++中當定義類物件是指標物件時候,就需要用到->指向類中的成員;當定義一般物件時候時就需要用到"."指向類中的成員.......
例如:
class A
{
public
play();
}
如果定義如下:
A *p則:p->play()使用; 左邊是結構指標。
A p 則:p.paly()使用; 左邊是結構變數。
總結:
箭頭(->):左邊必須為指標;
點號(.):左邊必須為實體。
補充:
C++語言為包含點操作符和解引用操作符的表示式提供了一個同義詞:箭頭操作符(->)。點操作符用於獲取類型別物件的成員:
item1.same_isbn(item2); // run the same_isbn member of item1
如果有一個指向Sales_item物件的指標(或迭代器),則在使用點操作符前,需對該指標(或迭代器)進行解引用:
Sales_item *sp = &item1;
(*sp).same_isbn(item2); // run same_isbn on object to which sp points
這裡,對sp進行解引用以獲得指定的Sales_item物件。然後使用點操作符呼叫指定物件的same_isbn成員函式。在上述用法中,注意必須用圓括號把解引用括起來,因為解引用的優先順序低於點操作符。如果漏掉圓括號,則這段程式碼的含義就完全不同了:
// run the same_isbn member of sp then dereference the result!
*sp.same_isbn(item2); // error: sp has no member named same_isbn
這個表示式企圖獲得sp物件的same_isbn成員。等價於:
*(sp.same_isbn(item2)); // equivalent to *sp.same_isbn(item2);
然而,sp是一個沒有成員的指標;這段程式碼無法通過編譯。
因為程式設計時很容易忘記圓括號,而且這類程式碼又經常使用,所以C++為在點操作符後使用的解引用操作定義了一個同義詞:箭頭操作符(->)。假設有一個指向類型別物件的指標(或迭代器),下面的表示式相互等價:
(*p).foo; // dereference p to get an object and fetch its member named foo
p->foo; // equivalent way to fetch the foo from the object to which p points
具體地,可將same_isbn的呼叫重寫為:
sp->same_isbn(item2); // equivalent to (*sp).same_isbn(item2)