【问题标题】:Why does ((*i)->getFirstName()) work, as opposed to *i->getFirstName() or Employee[*i]getFirstName()?为什么 ((*i)->getFirstName()) 有效,而不是 *i->getFirstName() 或 Employee[*i]getFirstName()?
【发布时间】:2021-03-29 13:48:14
【问题描述】:

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

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 是一个迭代器,您不能使用operator[]( iterator ) 访问vector 元素。操作顺序是-&gt; 优先于*,所以-&gt; 先发生。
  • 运算符优先级或操作顺序。它还有助于了解您正在使用的类型,因为您认为应该工作的前两个调用是 100% 虚假的。
  • Employee[i] 如果i 是整数索引,例如for (int i = 0; i &lt; Employees.size(); i++)

标签: c++ class pointers vector dereference


【解决方案1】:

i 是一个迭代器对象,而不是数字索引,所以Employee[i] 和Employee[*i] 都是错误的(如您所见)。

关于*i-&gt;getFirstName() 与(*i)-&gt;getFirstName(),-&gt; 运算符比* 运算符具有higher precedence。所以*i-&gt;getFirstName() 会被解释为好像你写了*(i-&gt;getFirstName()),即“在i 上执行getFirstName() 方法,然后取消引用结果”。因为i 是一个迭代器,并且没有getFirstName() 方法,这不会编译。另一方面,(*i)-&gt;getFirstName() 将被解释为“取消引用i 迭代器以获取Employee*,然后在它指向的对象上执行getFirstName() 方法to",这是你想要得到的行为。

【讨论】:

  • “由于i 是一个迭代器,并且没有getFirstName() 方法,因此无法编译” - 这不是原因。可以使用-&gt; 取消对迭代器的引用,从而产生对其所引用元素的引用。但是,由于本例中的元素是指针,所以不能在指针上调用方法,只能在指针指向的对象上调用。这就是需要额外取消引用的原因。
猜你喜欢
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2018-01-09
  • 2013-03-24
  • 1970-01-01
  • 2022-07-13
  • 2011-10-06
相关资源
最近更新 更多