我正在进行Box2D编程,并且抬头,我是C ++和C的总菜鸟。我是一个Objective-C家伙,这就是为什么我很难理解这门语言。特别是:
->
基本上我理解这用于引用不同的方法或函数或变量/属性,如下所示:
body->GetWorld()->DestroyBody(body);
这相当于Objective-C中的点符号:
// made up example
[body.world destroyBody];
或
[self destroyBody:body.world];
或类似的东西?我真的不明白这一点。有人可以告诉我这是什么。谢谢!
答案 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).b
。 b
可以是成员函数的数据成员,但被访问的成员将具有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
祝你有个美好的一天。 谢谢。