[英]Is there a C++ equivalent to objective-c's -debugDescription method for Xcode 7?
[英]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.