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++ 中解释 ->
和 .
之间的区别,希望对您有所帮助。
.
是允许您访问结构/类实例成员的运算符。 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).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
祝你今天开心。谢谢。
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 检查TCHAR数组输入是否为带符号整数C++
- 用符号版本替换对函数的所有调用
- 未解析的外部符号_MsiLocateComponentW@12.
- C的->等同于Objective-C中的点符号吗
- (Objective-)C++模板专用化上的重复符号
- 使用符号c++库:如何在objective C中打印矩阵输出描述?因为我加了两个矩阵.代码如下,谢谢