2009-08-06 106 views

回答

11

.運營商是爲直接成員訪問。

object.Field 

箭頭取消引用指針,以便可以訪問該對象/存儲器它指向

pClass->Field 
26

箭頭操作者是像點,除了它第一解引用的指針。 foo.bar()調用方法bar()對象foo,foo->bar調用方法bar對指針foo指向的對象。

+1

而如果事情是不是指針是什麼? – juanchopanza 2015-08-11 09:24:27

2

- >當你有指針 時使用。當你想要屬於結構用途的點屬性時使用結構(類) 。 structure.attribute 時想點屬性,通過指針使用具有指向同內存 - >:

pointer->method; 
or same as: 
(*pointer).method 
10

目標。點對點工作;箭頭用於指向對象的指針。

std::string str("foo"); 
std::string * pstr = new std::string("foo"); 

str.size(); 
pstr->size(); 
54

點運算符不能重載,箭頭運算符可能被重載。箭頭運算符一般意味着應用於指針(或者像指針一樣行爲的對象,如智能指針)。點運算符不能應用於指針。

EDIT 當施加到指針箭頭操作符相當於應用點操作指針對象 (ptr->場等價於(* PTR)點域)

+1

儘管間接運算符('* foo')可能超載 – user 2014-02-23 23:52:37

263

foo->bar()相同(*foo).bar()

由於*.運營商的綁定強度,上述括號是必要的。因爲點(.)運算符會首先評估

*foo.bar()是行不通的(見operator precedence

點(.)運營商不能超載,箭頭(->)運算符可以被重載。

點(.)運算符不能應用於指針。

另見:What is the arrow operator (->) synonym for in C++?

+4

請注意,這僅適用於原始指針。對於重載運算符的類類型,它有一些其他有趣的屬性... – 2012-07-17 18:19:05

+0

它不會打擾 - >是向下鑽取的運算符,因此如果重載它不等效於derefenced對象的成員(* boo) .foo?就好像boo-> foo可能被重載以返回一箇中間代理對象,該對象的foo成員與原始類中的成員不同。不會這樣斷言((* boo).foo == boo-> foo)失敗。的確,人們應該謹慎,因爲C++精靈可能在黑暗中潛伏着。 – g24l 2015-01-19 18:17:10

11
pSomething->someMember 

相當於

(*pSomething).someMember 
1

這很簡單,只要看到

x->y 

知道它是一樣的

(*x).y 
+3

除外,例如 - >過載時。 – jmtd 2009-08-06 13:20:31

+3

當你重載時 - >你也應該重載*,這樣這種關係就成立了。否則會引起各種各樣的混亂。 – 2009-08-06 13:39:58

1

。 (點)運算符通常用於從類的實例(或類的靜態字段/方法)獲取字段/調用方法。

p.myField,p.myMethod() - >(箭頭)操作用於獲取場/調用從由類所指向的內容的方法 - 一個類

的p個實例。

P-> MyField的,對 - > myMethod的() - p指向一類

3

注意 - >運算符不能用於某些事情,例如,操作者訪問[]。

#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. 
} 
+3

顯然不是。因爲「foo->」並不意味着「(* foo)」。它的意思是「(* foo)」。它也不能用於加法,減法...;) – jmtd 2009-08-06 13:21:36

+0

我不明白這是如何相關的。 member [0]也沒有任何意義,但是語法糖會將其轉換爲member.operator [](0)(如果適用)。值得注意的是 - >不會讓你做大多數人通常所期望的。我的意思是,關於那個操作員,我的意思是 – gparent 2009-08-06 13:56:55

+0

。 – gparent 2009-08-06 13:57:32

1

的 - >爲指針引用只是語法糖,

正如其他人所說:

指針 - >方法();

是說的簡單方法:

(*指針)。方法();

更多指針的樂趣,看看賓基,他的魔杖提領的:

http://www.youtube.com/watch?v=UvoHwFvAvQE

57

對於指針,我們可以只使用

*pointervariable.foo 

.運營商具有更大的優先於*運營商,因此首先對.進行評估。因此,我們需要用括號強制這樣的:

(*pointervariable).foo 

但鍵入()的所有的時間是很難的,所以他們開發->的快捷方式說同樣的話。如果訪問的對象或對象引用的屬性,使用.如果通過一個指針訪問一個對象的屬性,使用->

1

兩者之間的最簡單的區別在於,「 - >」取消引用一個指針前它會查看該對象字段,函數等,而「。」不首先解除引用。當你有一個指向對象的指針時使用「 - >」,並使用「。」。當你使用對象的實際實例時。

另一種等效的方法是使用指針的解除引用「*」,然後使用「。」。我們使用「 - >」跳過中間人。

還有其他的不同,但其他的答案已經廣泛地涉及這一點。

如果你有Java的背景,這可能會讓你困惑,因爲在Java中,一切都是指針。這意味着沒有理由讓符號不首先引用您的指針。然而,在C++中,要記住什麼是什麼以及什麼不是指針,所以要小心一點,用「p_」或「p」作爲前綴標記它們可能是個好主意。

1

當我們使用指針時,使用 - >操作符,否則使用點。 因此,如果我們有一個結構類,如:

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 

注:對於一類,接入類的成員函數的方式也將是同樣的方式

相關問題