-7

在数组中使用.和使用时有什么区别?->那是:

(*foo[i]).bar

对比

foo[i]->bar

或者:它们是一样的吗?

编辑:顺便说一句,其他参考仅在foo.barand之间询问foo->bar。我知道区别。但最近,我正在阅读一些(*foo).bar我认为应该使用的示例foo->bar

4

4 回答 4

9

假设foo是一个简单的 POD 用户定义类型在数组中使用,那 2 条语句肯定不一样。您可能知道,以下所有内容对于上述上下文具有相同的语义含义:

  *foo
  *(foo + 0)
  foo[0]
  0[foo]

如果您采用 2 个语句并将它们替换为第 3 种形式,您将得到:

(*foo)[i].bar ==> foo[0][i].bar

对比

foo[i]->bar ==> (*foo[i]).bar ==> foo[i][0].bar

您可以通过一个简单的测试来确认这一点:

#include <stdio.h>
#include <assert.h>

struct foo_t
{
  int bar;
};

int main()
{
    foo_t foo[2][2] = { { {0xdeadbeef}, {0xbadbeef} }, 
                        { {0xbadf00d}, {0xdecafbad} } };

    assert((*foo)[1].bar == foo[0][1].bar);
    assert(foo[1]->bar == foo[1][0].bar);
    assert(foo[1]->bar != (*foo)[1].bar);

    printf("(*foo)[1].bar: %x\n", (*foo)[1].bar);
    printf("foo[1]->bar: %x\n", foo[1]->bar);
}

如果它们相同,则第三个断言将失败,并且输出不会是原来的样子。

于 2013-07-04T10:14:32.210 回答
3

没有区别。但是foo[i]->bar比使用解引用运算符更清楚。特别是当您将有多个级别的指针最终指向对象时,使用解引用运算符将​​使您的代码难以理解。

于 2013-07-04T05:05:10.120 回答
3

首先,数组增加了一些混乱。假设您要问之间的区别

(*x).bar;

对比

x->bar;

对于x某种类型的实例T,然后对于指针,两者是等价的:两者都取消引用指向某种类型的指针以访问成员。但是由于在 C++ 中,您可以为用户定义的类型重载两个操作符,即operator->()and operator *(),您可能会遇到两个代码示例不等价的情况。这不应该发生在任何健全的代码中,但这是可能的。以下代码示例说明了这一点:

#include <iostream>
struct Foo
{
  void hello() const { std::cout << "Foo!!!\n"; }
};

struct Bar
{
  void hello() const { std::cout << "Bar!!!\n"; }
};

struct FooBar
{
  Foo foo;
  Bar bar;
  const Foo& operator*() const { return foo; }
  const Bar* operator->() const {return &bar; }
};

int main()
{
  FooBar fb;
  fb->hello();
  (*fb).hello();
}

输出:

酒吧!!!

呼!!!

于 2013-07-04T16:55:54.980 回答
1

1.-> 用于通过指向对象的指针访问对象成员变量和方法

Foo *foo = new Foo();
foo->var= 10;
foo->func();

2..用于通过对象实例访问对象成员变量和方法

Foo foo;
foo.var= 10;
foo.func();
于 2013-07-04T05:07:00.060 回答