为什么 ((*i)->getFirstName()) 有效,而不是 *i->getFirstName() 或 Employee[*i]getFirstName()?

问题描述

为什么这行代码在这种情况下有效?

cout << ((*i)->getFirstName());

上下文

class Employee{
  private:
    string FirstName;

  public:
    Employee(string FirstName);

  void setFirstName(string FName) {
    FirstName = FName;
  }

  string getFirstName(){
    return FirstName;
  }
} //End of Class

在主要(已设置名字并已填写员工)

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()-> 运算符比 * 运算符具有 higher precedence。所以 *i->getFirstName() 会被解释为好像你写了 *(i->getFirstName()),即“在 getFirstName() 上执行 i 方法,然后取消引用结果”。因为 i是一个迭代器,并且没有 getFirstName() 方法,这不会编译。另一方面,(*i)->getFirstName() 将被解释为“取消引用 i 迭代器以获取 { {1}},然后在它指向的对象上执行 Employee* 方法”,这是您试图获得的行为。