在c++中,点(.)操作符和->有什么区别?


当前回答

很简单,只要你看到

 x->y

知道它是一样的

 (*x).y

其他回答

目标。 Dot用于对象;箭头作用于指向对象的指针。

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

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

两者之间最简单的区别是"->"在指针去查看对象字段、函数等之前解引用,而"."不先解引用。当你有一个指向对象的指针时,使用"->",当你处理一个对象的实际实例时,使用"."。

另一种等效的书写方法可能是先在指针上使用取消引用的“*”,然后只使用“.”。我们通过使用“->”跳过中间商。

还有其他不同之处,但其他答案已经广泛地涵盖了这一点。

如果您有Java背景,这可能会让您感到困惑,因为在Java中,所有东西都是指针。这意味着没有理由让符号不首先解除对指针的引用。然而,在c++中,你必须更加小心地记住什么是指针,什么不是指针,用前缀“p_”或简单的“p”来标记它们可能是一个好主意。

pSomething->someMember

等于

(*pSomething).someMember

注意->操作符不能用于某些事情,例如访问操作符[]。

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

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

当你想要指向属于结构使用的属性时:

structure.attribute

当你想通过指针指向一个有内存引用的属性时,使用->:

pointer->method;

或与:

(*pointer).method