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

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

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

上面的括号是必需的,因为*和的绑定强度. 运营商。

*foo.bar()将不起作用,因为首先计算点( . )运算符(请参阅运算符优先级 )

点( . )运算符不能被重载,箭头( -> )运算符可以被重载。

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

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

点运算符不能重载,箭头运算符可以重载。 箭头运算符通常意味着应用于指针(或者像指针一样行为的对象,比如智能指针)。 点运算符不能应用于指针。

编辑应用于指针箭头运算符相当于应用点运算符指针(ptr->字段相当于(* ptr).field)

对于一个指针,我们可以使用

 *pointervariable.foo 

但是. 运算符优先于*运算符,所以. 首先评估。 所以我们需要用括号强制这个:

 (*pointervariable).foo 

但是,一直打字()是很难的,所以他们发展成一个捷径来说同样的事情。 如果您正在访问对象或对象引用的属性,请使用. 如果通过指针访问对象的属性,请使用->

箭头运算符就像点一样,除了它先取消引用指针。 foo.bar()调用对象foo方法bar()foo->bar调用指针foo指向的对象的方法bar

 pSomething->someMember 

相当于

 (*pSomething).someMember 

目标。 点在物体上工作; 箭头指向对象的指针。

 std::string str("foo"); std::string * pstr = new std::string("foo"); str.size (); pstr->size (); 

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

 object.Field 

箭头取消引用一个指针,所以你可以访问它指向的对象/内存

 pClass->Field 

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

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

– >当你有指针时使用。 当你想要属于结构用途的点属性的时候使用结构(class)。 当需要指向具有指针引用的属性时,struct.attribute使用 – >:

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

这很简单,只要你看到

  x->y 

知道它是一样的

  (*x).y 

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

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

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

p-> myField,p-> myMethod() – p指向一个类

– >仅仅是一个指针解引用的语法糖,

正如其他人所说:

指针 – >方法();

是一个简单的说法:

(*指针)。方法();

为了获得更多的指针,请查看Binky和他的解除引用的魔杖:

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

两者之间最简单的区别在于“ – >”在查看对象字段,函数等之前,先取消引用指针,而“。” 先不解除引用。 当你有一个指向对象的指针时使用“ – >”,并使用“。” 当你正在处理对象的实际实例时。

另一种等同的方法是使用指针上的“*”,然后使用“。”。 我们用“ – >”来跳过中间人。

还有其他的不同,但其他的答案已经广泛地涉及这一点。

如果你有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 

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