簡體   English   中英

C是 - >相當於Objective-C中的點符號

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

我正在進行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 ++中,希望有所幫助。

. 是允許您訪問struct / class實例的成員的運算符。 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 ++中訪問struct和class成員。

Objective-C屬性訪問器適用於類型為id值(這是一種指針類型),但使用特殊的命名約定來決定它實際執行的操作。 它可以直接訪問屬性數據成員,使其類似於->用於數據成員訪問。 或者它可以查找用於獲取和/或設置屬性值的特殊函數,在這種情況下,它是消息發送的語法糖。

除了在C ++中運算符重載的情況之外, ->始終與取消引用指針然后訪問引用的成員相同。 a->b相當於(*a).b b可以是成員函數的數據成員,但被訪問的成員將具有b提到的確切名稱,而不是基於任何特殊命名約定的某些變異。 如果b命名一個成員函數,那么它可能是一個虛函數,它與Objective-C中的消息發送有一些相似之處,但不一樣。 b也可能是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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM