340

What is the difference between the dot (.) operator and -> in C++?

JoeG
  • 12,484
  • 1
  • 34
  • 62
moorthy
  • 3,433
  • 3
  • 14
  • 5

14 Answers14

346

foo->bar() is the same as (*foo).bar().

The parenthesizes above are necessary because of the binding strength of the * and . operators.

*foo.bar() wouldn't work because Dot (.) operator is evaluated first (see operator precedence)

The Dot (.) operator can't be overloaded, arrow (->) operator can be overloaded.

The Dot (.) operator can't be applied to pointers.

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

SwDevMan81
  • 45,922
  • 20
  • 140
  • 177
  • 4
    Note that this is only for raw pointers. For class types that overload the operator, it has some other interesting properties... – David Rodríguez - dribeas Jul 17 '12 at 18:19
  • doesn't it bother that -> is a drill down operator, and thus if overloaded it is not equivalent to member of the derefenced object (*boo).foo ? as if boo->foo may be overloaded to return an intermediate proxy object which has a foo member different from that in the originating class. Wouldn't that assert( (*boo).foo == boo->foo ) fail. It is true that one should be cautious as the c++ elves may be lurking in the dark. – g24l Jan 19 '15 at 18:17
73

For a pointer, we could just use

*pointervariable.foo

But the . operator has greater precedence than the * operator, so . is evaluated first. So we need to force this with parenthesis:

(*pointervariable).foo

But typing the ()'s all the time is hard, so they developed -> as a shortcut to say the same thing. If you are accessing a property of an object or object reference, use . If you are accessing a property of an object through a pointer, use ->

Anuj Gupta
  • 8,690
  • 3
  • 26
  • 32
Gordon Gustafson
  • 36,457
  • 23
  • 109
  • 151
61

Dot operator can't be overloaded, arrow operator can be overloaded. Arrow operator is generally meant to be applied to pointers (or objects that behave like pointers, like smart pointers). Dot operator can't be applied to pointers.

EDIT When applied to pointer arrow operator is equivalent to applying dot operator to pointee e.g. ptr->field is equivalent to (*ptr).field.

n1k31t4
  • 2,090
  • 1
  • 19
  • 32
Tadeusz Kopec
  • 11,984
  • 6
  • 51
  • 79
31

The arrow operator is like dot, except it dereferences a pointer first. foo.bar() calls method bar() on object foo, foo->bar calls method bar on the object pointed to by pointer foo.

Meredith L. Patterson
  • 4,513
  • 25
  • 29
19

The . operator is for direct member access.

object.Field

The arrow dereferences a pointer so you can access the object/memory it is pointing to

pClass->Field
buræquete
  • 12,943
  • 4
  • 34
  • 69
Johannes Rudolph
  • 34,073
  • 12
  • 105
  • 164
13
pSomething->someMember

is equivalent to

(*pSomething).someMember
SwDevMan81
  • 45,922
  • 20
  • 140
  • 177
Tamás Szelei
  • 21,352
  • 16
  • 94
  • 169
11

The target. dot works on objects; arrow works on pointers to objects.

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

str.size ();
pstr->size ();
ezpz
  • 10,955
  • 6
  • 35
  • 36
10

Use -> when you have a pointer. Use . when you have structure (class).

When you want to point attribute that belongs to structure use .:

structure.attribute

When you want to point to an attribute that has reference to memory by pointer use -> :

pointer->method;

or same as:

(*pointer).method
Am1rr3zA
  • 5,777
  • 15
  • 66
  • 112
4

Note that the -> operator cannot be used for certain things, for instance, accessing 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.
}
gparent
  • 869
  • 7
  • 12
  • 6
    Clearly not. Because "foo->" does not mean "(*foo)". It means "(*foo).". It also can't be used for addition, subtraction... ;) – jmtd Aug 06 '09 at 13:21
  • I don't see how that's relevant. member[0] also doesn't mean anything, however syntactic sugar transforms it into member.operator[](0) if applicable. It's noteworthy that -> will not allow you to do what most people generally expect to be able to. – gparent Aug 06 '09 at 13:56
  • in regards to that operator, I mean. – gparent Aug 06 '09 at 13:57
  • 1
    I would imagine iVecPtr->operator[](0) would work, though. The point being that the syntactic sugar that you site turns [0] into .operator[](0); it does not turn .[0] into .operator[](0). – Domenic Aug 07 '09 at 01:18
2

It's simple, whenever you see

 x->y

know it is the same as

 (*x).y
Logan Capaldo
  • 37,749
  • 5
  • 60
  • 76
2

The -> is simply syntactic sugar for a pointer dereference,

As others have said:

pointer->method();

is a simple method of saying:

(*pointer).method();

For more pointer fun, check out Binky, and his magic wand of dereferencing:

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

Ali Parr
  • 4,587
  • 3
  • 27
  • 34
2

The simplest difference between the two is that "->" dereferences a pointer before it goes to look at that objects fields, function etc. whereas "." doesn't dereference first. Use "->" when you have a pointer to an object, and use "." when you're working with the actual instance of an object.

Another equivalent way of wrinting this might be to use the dereferencing "*" on the pointer first and then just use the ".". We skip middleman by using "->".

There are other differences, but the other answers have covered this extensively.

If you have a background in Java this might confuse you, since, in Java, everything is pointers. This means that there's no reason to have symbol that doesn't dereference your pointer first. In c++ however you gotta be a little more careful with remembering what is and what isn't a pointer, and it might be a good idea to label them with the prefix "p_" or simply "p".

1

The . (dot) operator is usually used to get a field / call a method from an instance of class (or a static field / method of a class).

p.myField, p.myMethod() - p instance of a class

The -> (arrow) operator is used to get a field / call a method from the content pointed by the class.

p->myField, p->myMethod() - p points to a class

Samuel Carrijo
  • 16,127
  • 11
  • 45
  • 59
1

The -> operator is used when we are working with a pointer and the dot is used otherwise. So if we have a struct class like:

struct class{ int num_students; int yr_grad; };

and we have an instance of a class* curr_class (class pointer), then to get access to number of students we would do

cout << curr_class->num_students << endl;

In case we had a simple class object , say class_2016, we would do

cout << class_2016.num_students << endl;

For the pointer to class the -> operator is equivalent to

(*obj).mem_var

Note: For a class, the way to access member functions of the class will also be the same way

PYA
  • 5,788
  • 3
  • 16
  • 36