點(。)運算符和 - >在C++中有什麼區別?點(。)運算符和 - >在C++中有什麼區別?
回答
.
運營商是爲直接成員訪問。
object.Field
箭頭取消引用指針,以便可以訪問該對象/存儲器它指向
pClass->Field
箭頭操作者是像點,除了它第一解引用的指針。 foo.bar()
調用方法bar()
對象foo
,foo->bar
調用方法bar
對指針foo
指向的對象。
- >當你有指針 時使用。當你想要屬於結構用途的點屬性時使用結構(類) 。 structure.attribute
時想點屬性,通過指針使用具有指向同內存 - >:
pointer->method;
or same as:
(*pointer).method
目標。點對點工作;箭頭用於指向對象的指針。
std::string str("foo");
std::string * pstr = new std::string("foo");
str.size();
pstr->size();
點運算符不能重載,箭頭運算符可能被重載。箭頭運算符一般意味着應用於指針(或者像指針一樣行爲的對象,如智能指針)。點運算符不能應用於指針。
EDIT 當施加到指針箭頭操作符相當於應用點操作指針對象 (ptr->場等價於(* PTR)點域)
儘管間接運算符('* foo')可能超載 – user 2014-02-23 23:52:37
foo->bar()
相同(*foo).bar()
。
由於*
和.
運營商的綁定強度,上述括號是必要的。因爲點(.
)運算符會首先評估
*foo.bar()
是行不通的(見operator precedence)
點(.
)運營商不能超載,箭頭(->
)運算符可以被重載。
點(.
)運算符不能應用於指針。
請注意,這僅適用於原始指針。對於重載運算符的類類型,它有一些其他有趣的屬性... – 2012-07-17 18:19:05
它不會打擾 - >是向下鑽取的運算符,因此如果重載它不等效於derefenced對象的成員(* boo) .foo?就好像boo-> foo可能被重載以返回一箇中間代理對象,該對象的foo成員與原始類中的成員不同。不會這樣斷言((* boo).foo == boo-> foo)失敗。的確,人們應該謹慎,因爲C++精靈可能在黑暗中潛伏着。 – g24l 2015-01-19 18:17:10
pSomething->someMember
相當於
(*pSomething).someMember
這很簡單,只要看到
x->y
知道它是一樣的
(*x).y
除外,例如 - >過載時。 – jmtd 2009-08-06 13:20:31
當你重載時 - >你也應該重載*,這樣這種關係就成立了。否則會引起各種各樣的混亂。 – 2009-08-06 13:39:58
。 (點)運算符通常用於從類的實例(或類的靜態字段/方法)獲取字段/調用方法。
p.myField,p.myMethod() - >(箭頭)操作用於獲取場/調用從由類所指向的內容的方法 - 一個類
的p個實例。
P-> MyField的,對 - > myMethod的() - p指向一類
注意 - >運算符不能用於某些事情,例如,操作者訪問[]。
#include <vector>
int main()
{
std::vector<int> iVec;
iVec.push_back(42);
std::vector<int>* iVecPtr = &iVec;
//int i = iVecPtr->[0]; // Does not compile
int i = (*iVecPtr)[0]; // Compiles.
}
的 - >爲指針引用只是語法糖,
正如其他人所說:
指針 - >方法();
是說的簡單方法:
(*指針)。方法();
更多指針的樂趣,看看賓基,他的魔杖提領的:
對於指針,我們可以只使用
*pointervariable.foo
但.
運營商具有更大的優先於*
運營商,因此首先對.
進行評估。因此,我們需要用括號強制這樣的:
(*pointervariable).foo
但鍵入()的所有的時間是很難的,所以他們開發->
的快捷方式說同樣的話。如果訪問的對象或對象引用的屬性,使用.
如果通過一個指針訪問一個對象的屬性,使用->
兩者之間的最簡單的區別在於,「 - >」取消引用一個指針前它會查看該對象字段,函數等,而「。」不首先解除引用。當你有一個指向對象的指針時使用「 - >」,並使用「。」。當你使用對象的實際實例時。
另一種等效的方法是使用指針的解除引用「*」,然後使用「。」。我們使用「 - >」跳過中間人。
還有其他的不同,但其他的答案已經廣泛地涉及這一點。
如果你有Java的背景,這可能會讓你困惑,因爲在Java中,一切都是指針。這意味着沒有理由讓符號不首先引用您的指針。然而,在C++中,要記住什麼是什麼以及什麼不是指針,所以要小心一點,用「p_」或「p」作爲前綴標記它們可能是個好主意。
當我們使用指針時,使用 - >操作符,否則使用點。 因此,如果我們有一個結構類,如:
struct class{ int num_students; int yr_grad; };
,我們有一個類* curr_class(類指針)的一個實例,然後以訪問學生的人數,我們會做
cout << curr_class->num_students << endl;
如果我們有一個簡單的類對象,說class_2016,我們會做
cout << class_2016.num_students << endl;
爲指針類 - >運算符相當於
(*obj).mem_var
注:對於一類,接入類的成員函數的方式也將是同樣的方式
- 1. 運算符>>和運算符>>>在java中有什麼區別?
- 2. 運算符>>>在Java和JavaScript中有什麼區別?
- 3. 在php中!=和<>運算符有什麼區別?
- 4. SQL中的IN運算符和=運算符有什麼區別?
- 5. c編程中的*和&運算符有什麼區別?
- 6. C中的投射運算符和後綴有什麼區別?
- 7. obj c函數中(+)和( - )運算符有什麼區別
- 8. 在Solr中,NOT和 - (minus)運算符有什麼區別?
- 9. 在PHP中!=和<>運算符有什麼區別,哪個最好?
- 10. PHP中的「和」和「&&」運算符有什麼區別嗎?
- 11. 不等號運算符:!= vs <>,有什麼區別?
- 12. 在Purescript; - >和=>有什麼區別?
- 13. Java中> =和=>有什麼區別?
- 14. C++中+ =和= +運算符的區別?
- 15. Lucene中 - 和NOT運算符有什麼區別?
- 16. Bash中運算符「=」和「==」有什麼區別?
- 17. Julia中的「==」和「===」比較運算符有什麼區別?
- 18. python中的/和//運算符有什麼區別?
- 19. 運算符重載kotlin中的plus和plusAssign有什麼區別?
- 20. 貓鼬中的.in()和all。()運算符有什麼區別?
- 21. SQL中NOT和!=運算符有什麼區別?
- 22. 什麼是c運算符>>
- 23. 在php中兩個不等於運算符有什麼區別?
- 24. > =和=>有什麼區別?
- 25. <%# %>和<%= %>有什麼區別?
- 26. Malloc和新運算符分配內存有什麼區別?
- 27. 使用Object.create()和使用賦值運算符有什麼區別?
- 28. +運算符和+函數有什麼區別是vhdl?
- 29. 新運算符和Class.newInstance()之間有什麼區別?
- 30. 匹配方法和=〜運算符有什麼區別?
而如果事情是不是指針是什麼? – juanchopanza 2015-08-11 09:24:27