6

我正在做 Box2D 编程,并且抬头,我对 C++ 和 C 完全是个菜鸟。我是一个 Objective-C 人,这就是为什么我很难理解这门语言。尤其:

->

基本上我知道这用于引用不同的方法或函数或变量/属性,如下所示:

body->GetWorld()->DestroyBody(body);

这是否等同于 Objective-C 中的点表示法:

// made up example
[body.world destroyBody];

或者

[self destroyBody:body.world];

或者类似的东西?我真的不明白这个。有人可以告诉我这是什么。谢谢!

4

5 回答 5

10

我不知道 Objective-C,但我可以解释 C 和 C++ 之间的区别->.希望对您有所帮助。

.是允许您访问结构/类实例的成员的运算符。a->b(*a).b- 所以它首先取消引用指针,然后访问指针指向的实例的成员。

此外,Luchian 提到了一个案例 -operator->()给定类的重载。如果您使用的类确实重载了此运算符,则行为会有所不同,由类定义 - 它几乎可以返回它想要的所有内容。

于 2012-05-21T09:58:42.570 回答
4

我对 Objective-C 了解不多,但我可以尝试为您提供一些有关 C++ 的帮助:假设您Foo在 C++ 中定义了一个类,并使用了一个方法bar()

class Foo
{
public:
  void bar();
  ...
};

如果Foo 在堆栈上分配 的实例,则使用点表示法( .) 调用该方法bar()

Foo f;
f.bar();

如果您有一个指向的实例的指针Foo,则使用箭头符号( ->) 来调用该方法bar()

Foo* pf; // must point to some instance of Foo
pf->bar();

(更复杂的是,还有引用,它们具有值语法和指针语义:如果您有对Foo(例如Foo& f)的引用,您仍然使用点符号:f.bar();。)

于 2012-05-21T10:03:28.183 回答
2

不,用于.访问 Objective-C 属性与访问 C 和 C++ 中的结构和类成员不同。->.

Objective-C 属性访问器对类型的值id(它是一个指针类型)起作用,但使用特殊的命名约定来决定它实际做什么。它可以直接访问属性数据成员,使其类似于->数据成员访问。或者它可以查找用于获取和/或设置属性值的特殊函数,在这种情况下,它是消息发送的语法糖。

除了 C++ 中运算符重载的情况外,->它始终与取消引用指针然后访问引用的成员相同。a->b相当于(*a).bb可能是成员函数的数据成员,但被访问的成员将具有引用的确切名称b,而不是基于任何特殊命名约定的某种突变。如果b命名一个成员函数,那么它可能是一个虚函数,它与 Objective-C 中的消息发送有一些相似之处,但并不相同。b也可能是 C++ 中的重载成员函数,在 Objective-C 中没有等价物。

在 Objective-C 中添加用于访问对象属性的.语法违反了 Objective-C 的设计原则,即新功能应该看起来是新的。使用@[]消息发送语法和定义 Objective-C 对象的特殊关键字是 Objective-C 之前遵循此设计原则的示例。

于 2012-05-21T11:07:04.707 回答
2

.用于访问对象成员,->用于通过指针访问成员。通常. operator ->可以重载,这意味着您也可以在对象上使用它:

struct X
{
   X* other;
   X* operator->() {return other;}
};

X x;
x->other;

在这种情况下,x->other不指代x.other,而是指代x.other.other。:D

于 2012-05-21T10:06:42.343 回答
1

这是objective-c 代码。

@interface Foo : NSObject
{
  NSInteger _a;
}
@property (nonatomaic, assign) NSInteger a;
@end

@implement Foo
@synthesize a = _a;
@end

你知道'@synthesize' 短语。@synthesize 创建波纹管代码。

- (NSInteger)a
{
  return _a;
}


- (void)setA:(NSInteger)aa
{
  return _a = aa;
}

让我们访问属性 a。

void main()
{
  Foo foo = [[Foo alloc] init];
  foo.a = 1;
}

必须将 foo.a 分配为 1。但编译器调用如下。

void main()
{
  Foo foo = [[Foo alloc] init];
  [foo setA:1];
}

foo.a = 1 和 [foo setA:1] 是一样的。foo.a = 1 调用 [foo setA:1]。

贝娄,用 C 语言编写。

class Foo
{
private:
  int _a;
public:
  int getA();
  void setA(const int aa);
};

int Foo::getA()
{
   return _a;
}
void Foo::setA(const int aa)
{ 
   _a = aa;
}

// local allocation example.

void main()
{
  Foo foo;
  foo.setA(1);
}

// Heap allocation example.
void main()
{
   Foo *foo = new Foo();
   foo->setA(1);
   delete foo;
}

// Pointer (like object objectve-c).
void main()
{
   Foo foo1;
   foo1.setA(1);

   Foo *foo2 = &foo1;
   foo2->setA(2);

   printf("result>>> %d, %d", foo1.a, foo2->a); 
}

result>>>  2, 2

foo1.a 和 foo2->a 也是 2。Objectve-C 示例如下。

void main()
{
   Foo *foo1 = [[Foo alloc] init];
   foo1.a = 1;

   Foo *foo2 = foo1;
   foo2.a = 2;

   NSLog(@"result>>> %d, %d", foo1.a, foo2.a);
}

result>>>  2, 2

祝你有美好的一天。谢谢你。

于 2012-05-29T16:10:06.160 回答