从指针访问[]运算符

Mal*_*rba 33 c++ pointers operators

如果我定义一个指向定义[]运算符的对象的指针,是否有直接的方法从指针访问此运算符?

例如,在下面的代码中,我可以通过使用指针的运算符直接访问Vec的成员函数(例如empty())->,但是如果我想访问[]运算符,我需要先获取对象的引用然后调用运算符.

#include <vector>

int main(int argc, char *argv[])
{
    std::vector<int> Vec(1,1);
    std::vector<int>* VecPtr = &Vec;

if(!VecPtr->empty())      // this is fine
    return (*VecPtr)[0]; // is there some sort of ->[] operator I could use?

return 0;
}
Run Code Online (Sandbox Code Playgroud)

我可能错了,但看起来做(*VecPtr).empty()的效率低于做VecPtr->empty().这就是我寻找替代品的原因(*VecPtr)[].

Rob*_*obᵩ 37

您可以执行以下任何操作:

#include <vector>

int main () {
  std::vector<int> v(1,1);
  std::vector<int>* p = &v;

  p->operator[](0);
  (*p)[0];
  p[0][0];
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,在特定情况下std::vector,您也可以选择:p->at(0),即使它的含义略有不同.

  • @ThekoLekena 准确地说,对于指向完整类型 T 的指针, [] 运算符被定义为访问数组的第 i 个元素(通过计算 sizeof(T) * i )。当然,由于在这种情况下我们有一个指向 **一个** 向量的指针,因此除 [0] 之外的任何内容都将是未定义的行为。**编辑**:我不会选择最后一个,因为我发现它不太惯用。 (3认同)
  • 最后一个很有趣,你能解释一下引擎盖下发生了什么吗?第一个 [0] 是指指针指向的“第一个元素”吗?类似于向量引用是指向数组开头的指针吗? (2认同)

Sea*_*ean 8

return VecPtr->operator[](0);
Run Code Online (Sandbox Code Playgroud)

......会做的.但实际上,(*VecPtr)[0]表格看起来更好,不是吗?