C的->等同于Objective-C中的点符号吗

Is C's -> equivalent to dot notation in Objective-C

本文关键字:Objective-C 符号 gt 等同于      更新时间:2023-10-16

我正在做Box2D编程,抬起头来,我完全是C++和C的菜鸟。我是一个Objective-C的人,这就是为什么我很难理解这门语言。特别是:

->

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

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

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

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

[self destroyBody:body.world];

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

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

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

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

我对 Objective-C 了解不多,但我可以尝试为您提供一些有关C++的帮助:假设您在C++中定义了一个类Foo,方法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(); .(

.用于

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

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

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

不,使用 . 访问 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以前遵循此设计原则的示例。

这是 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

祝你今天开心。谢谢。