C++ 为什么((*i)->getFirstName()可以工作,而不是*i->getFirstName()或Employee[*i]getFirstName()?

C++ 为什么((*i)->getFirstName()可以工作,而不是*i->getFirstName()或Employee[*i]getFirstName()?,c++,class,pointers,vector,dereference,C++,Class,Pointers,Vector,Dereference,为什么这行代码在这个场景中工作 cout << ((*i)->getFirstName()); 在主名称中,已设置姓名并填写员工姓名 vector<Employee *> Employees; Employees.push_back(new Employee(FirstName)); for (vector<Employee *>::iterator i = Employees.begin(); i < Employees.end(); i+

为什么这行代码在这个场景中工作

cout << ((*i)->getFirstName());
在主名称中,已设置姓名并填写员工姓名

vector<Employee *> Employees;

Employees.push_back(new Employee(FirstName));

for (vector<Employee *>::iterator i = Employees.begin(); i < Employees.end(); i++) {
  cout << ((*i)->getFirstName());
}
我的问题是,为什么上面这一行起作用,而不是以下任何一项

cout << Employee[*i]->getFirstName();

cout << Employee[i]->getFirstName();

cout << *i->getFirstName();       
i是一个迭代器对象,而不是数字索引,所以正如您所看到的,Employee[i]和Employee[*i]都是错误的


关于*i->getFirstName与*i->getFirstName的比较,->运算符的值比*运算符的值大。所以*i->getFirstName将被解释为您编写了*i->getFirstName,即在i上执行getFirstName方法,然后取消引用结果。由于i是迭代器,并且没有getFirstName方法,因此不会编译。另一方面,*i->getFirstName将被解释为取消引用i迭代器以获取Employee*,然后在它指向的对象上执行getFirstName方法,该对象是您试图获取的行为。

i是迭代器,无法使用运算符[]访问向量元素迭代器。操作顺序是->优先于*,因此->首先发生。运算符优先,或操作顺序。这也有助于了解您正在使用的类型,因为您认为应该工作的前两个调用是100%虚假的。Employee[i]如果我是整数索引,则可以使用,例如,对于int i=0;i取消引用,从而生成对它引用的元素的引用。但是,由于本例中的元素是指针,因此不能对指针调用方法,只能对指针指向的对象调用方法。这就是为什么需要额外的取消引用。
cout << Employee[*i]->getFirstName();

cout << Employee[i]->getFirstName();

cout << *i->getFirstName();