是C的 - >相当于Objective-C中的点符号

时间:2012-05-21 09:55:10

标签: c++ objective-c c

我正在进行Box2D编程,并且抬头,我是C ++和C的总菜鸟。我是一个Objective-C家伙,这就是为什么我很难理解这门语言。特别是:

->

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

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

这相当于Objective-C中的点符号:

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

[self destroyBody:body.world];

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

5 个答案:

答案 0 :(得分:10)

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

.是允许您访问struct / class实例成员的运算符。 a->b(*a).b相同 - 因此它首先取消引用指针,然后访问指针所指向的实例的成员。

此外,还有一个案例是Luchian提到的 - 重载了给定类的operator->()。如果你正在使用的类确实重载了这个操作符,那么行为将是不同的,由类定义 - 它几乎可以返回它想要的一切。

答案 1 :(得分:4)

我对Objective-C了解不多,但我可以尝试给你一些关于C ++的帮助:假设你用C ++定义一个类Foo,方法bar():< / p>

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

如果您在堆栈中分配Foo 的实例,则使用点符号.)来调用方法{{1 }}:

bar()

如果你有一个指针Foo f; f.bar(); 的实例,你可以使用箭头符号Foo)来调用方法{{ 1}}:

->

(更复杂的是,还有引用,它们具有值语法和指针语义:如果你引用了bar()(例如Foo* pf; // must point to some instance of Foo pf->bar(); ),你仍然使用点符号:Foo。)

答案 2 :(得分:2)

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

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

X x;
x->other;

在这种情况下,x->other不会x.other,而是x.other.other。 :d

答案 3 :(得分:2)

不,使用.访问Objective-C属性与->.不同,以便在C和C ++中访问struct和class成员。

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

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

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

答案 4 :(得分:1)

这是客观的代码。

@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-&gt; 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

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