点(。)运算符和 - >之间有什么区别?在C ++中?

时间:2009-08-06 12:41:07

标签: c++ operators

点(。)运算符和 - >之间有什么区别?在C ++中?

14 个答案:

答案 0 :(得分:297)

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

由于*.运算符的绑定强度,上面的括号是必要的。

*foo.bar()无效,因为首先评估了Dot(.)运算符(参见operator precedence

点(.)运算符无法重载,箭头(->)运算符可能会重载。

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

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

答案 1 :(得分:67)

对于指针,我们可以使用

*pointervariable.foo

.运算符的优先级高于*运算符,因此首先计算.。所以我们需要用括号强制它:

(*pointervariable).foo

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

答案 2 :(得分:55)

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

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

答案 3 :(得分:28)

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

答案 4 :(得分:14)

.运算符用于直接成员访问。

object.Field

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

pClass->Field

答案 5 :(得分:13)

pSomething->someMember

相当于

(*pSomething).someMember

答案 6 :(得分:10)

目标。 dot适用于物体; arrow适用于指向对象的指针。

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

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

答案 7 :(得分:5)

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

如果您想要属于结构的点属性,请使用.

structure.attribute

如果您想通过指针使用->来指向内存引用的属性:

pointer->method;

或与:

相同
(*pointer).method

答案 8 :(得分:3)

请注意 - >运算符不能用于某些事情,例如,访问operator []。

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

答案 9 :(得分:2)

只要你看到

,这很简单
 x->y

知道它与

相同
 (*x).y

答案 10 :(得分:2)

- &gt;只是指针取消引用的语法糖,

正如其他人所说:

指针 - &GT;方法();

是一种简单的说法:

(*指针)。方法();

要获得更多指针乐趣,请查看Binky和他的解除引用的魔棒:

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

答案 11 :(得分:1)

。 (点)运算符通常用于从类的实例(或类的静态字段/方法)获取字段/调用方法。

p.myField,p.myMethod() - 一个类的实例

- &gt; (箭头)运算符用于从类指向的内容中获取字段/调用方法。

p-&gt; myField,p-&gt; myMethod() - p指向一个类

答案 12 :(得分:1)

两者之间最简单的区别是&#34; - &gt;&#34;在指针查看对象字段,函数等之前取消引用指针。而#34;。&#34;不首先解除引用。使用&#34; - &gt;&#34;当你有一个指向对象的指针时,使用&#34;。&#34;当你正在使用对象的实际实例时。

另一种削弱这种情况的方法可能是使用解除引用&#34; *&#34;首先在指针上,然后只使用&#34;。&#34;。我们使用&#34; - &gt;&#34;。

跳过中间人

还有其他差异,但其他答案已经广泛涵盖了这一点。

如果你有Java背景,这可能会让你感到困惑,因为在Java中,一切都是指针。这意味着没有理由让符号首先取消引用指针。但是在c ++中,你需要更加小心地记住什么是什么,什么不是指针,并且用前缀&#34; p _&#34;标记它们可能是个好主意。或者只是&#34; p&#34;。

答案 13 :(得分:1)

- &gt;当我们使用指针时使用运算符,否则使用点。 所以,如果我们有一个结构类,如:

struct class{ int num_students; int yr_grad; };

我们有一个类* curr_class(类指针)的实例,然后访问我们会做的学生数

cout << curr_class->num_students << endl;

如果我们有一个简单的类对象,比如class_2016,我们会做

cout << class_2016.num_students << endl;

对于指向类的指针 - &gt;运算符等同于

(*obj).mem_var

注意:对于类,访问类的成员函数的方式也是一样的