点(.)运算符和C++中的 - >有什么区别?

moo*_*thy 300 c++ operators

点(.)运算符和C++中的 - >有什么区别?

SwD*_*n81 306

foo->bar()是一样的(*foo).bar().

上面的括号是必要的,因为*.运算符的绑定强度.

*foo.bar()因为.首先评估Dot()运算符而不起作用(参见运算符优先级)

Dot(.)运算符不能重载,arrow(->)运算符可以重载.

Dot(.)运算符不能应用于指针.

另请参阅:C++中的箭头运算符( - >)同义词是什么?

  • 请注意,这仅适用于原始指针.对于重载运算符的类类型,它还有一些其他有趣的属性...... (4认同)

Gor*_*son 69

对于指针,我们可以使用

*pointervariable.foo
Run Code Online (Sandbox Code Playgroud)

但是.运算符的优先级高于*运算符,因此.首先进行求值.所以我们需要用括号强制这个:

(*pointervariable).foo
Run Code Online (Sandbox Code Playgroud)

但是一直输入()很难,所以他们发展->成为说同样事情的捷径.如果要访问对象或对象引用的属性,请使用. 如果要通过指针访问对象的属性,请使用->


Tad*_*pec 57

点运算符不能重载,箭头运算符可以重载.箭头操作符通常用于指向指针(或类似指针的对象,如智能指针).点运算符不能应用于指针.

编辑当应用于指针箭头时,运算符相当于将点运算符应用于pointee(ptr-> field相当于(*ptr).field)


Mer*_*son 29

箭头操作符就像点,除了它首先取消引用指针.foo.bar()调用方法bar()的对象foo,foo->bar调用方法bar在对象上由指针所指向foo.


Joh*_*lph 16

.运营商是直接成员访问.

object.Field
Run Code Online (Sandbox Code Playgroud)

箭头取消引用指针,以便您可以访问它指向的对象/内存

pClass->Field
Run Code Online (Sandbox Code Playgroud)


Tam*_*lei 13

pSomething->someMember
Run Code Online (Sandbox Code Playgroud)

相当于

(*pSomething).someMember
Run Code Online (Sandbox Code Playgroud)


ezp*_*zpz 10

目标.dot适用于物体; 箭头适用于指向对象的指针.

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

str.size ();
pstr->size ();
Run Code Online (Sandbox Code Playgroud)


Am1*_*3zA 9

->有指针时使用。使用.时,你有结构(类)。

当您要指向属于结构的属性时,请使用.

structure.attribute
Run Code Online (Sandbox Code Playgroud)

当您要指向通过指针引用了内存的属性时,请使用->

pointer->method;
Run Code Online (Sandbox Code Playgroud)

或与:

(*pointer).method
Run Code Online (Sandbox Code Playgroud)