- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
") 运算符在 C 与 Objective-C 中的使用-6ren"> ") 运算符在 C 与 Objective-C 中的使用-我试图围绕 C 与 Objective-C 在用法和语法上的一些差异展开思考。特别是,我想知道 C 与 Objective-C 中点运算符和箭头运算符的用法有何不同(以及为什么)。这是一个简单的例子。-6ren">
我试图围绕 C 与 Objective-C 在用法和语法上的一些差异展开思考。特别是,我想知道 C 与 Objective-C 中点运算符和箭头运算符的用法有何不同(以及为什么)。这是一个简单的例子。
C 代码:
// declare a pointer to a Fraction
struct Fraction *frac;
...
// reference an 'instance' variable
int n = (*frac).numerator; // these two expressions
int n = frac->numerator; // are equivalent
Objective-C 代码:
// declare a pointer to a Fraction
Fraction *frac = [[Fraction alloc] init];
...
// reference an instance variable
int n = frac.numerator; // why isn't this (*frac).numerator or frac->numerator??
那么,看看 frac
在两个程序中是如何相同的(即它是一个指向 Fraction 对象或结构的指针),为什么它们在访问属性时使用不同的语法?特别是,在 C 中,numerator
属性使用 frac->numerator
访问,但在 Objective-C 中,使用点运算符访问它,使用 frac .numerator
。既然 frac
在两个程序中都是一个指针,为什么这些表达式不同呢?谁能帮我澄清一下?
最佳答案
frac
实际上在两个程序中并不相同。
C Fraction
是一个 struct
,它是一个没有重载运算符的基本类型,并且只能在默认情况下真正构造和销毁。如果您在结构上定义函数或字段,则在 C
中访问这些属性的方法是使用点 (.
) 运算符。当你使用 struct
s 时,Objective-C 会维护这个操作符。为方便起见,您可以使用箭头 (->
) 运算符(您提到的两个等效表达式)执行取消引用和点操作。 Objective-C 在访问 struct
s 时也保留了这一点。
然而,在您的示例中,Objective-C Fraction
可能(人们会假设)至少是 id
类型的指针,它只是一个类名和指针到引擎盖下的那个类的实例。它也很可能是 NSObject
或 NSProxy
的子类。这些 Objective-C 类的特殊之处在于它们在 C
结构之上有一整层预定义的操作(如果你真的想深入研究它,那么你可以看看 Objective-C Runtime Reference ) .另外需要注意的是,Objective-C 类总是一个指针。
最基本的操作之一是 objc_msgSend
。当我们对这些类型的对象进行操作时,Objective-C 编译器将点 (.
) 运算符或方括号语法 ([object method]
) 解释为 objc_msgSend
方法调用。有关此处实际发生的情况的更多详细信息,请参阅负责 Obj-C 运行时开发的 Apple 工程师 Bill Bumgarner 的 this series of posts。
箭头 (->
) 运算符实际上不应该用于 Objective-C 对象。就像我说的,Objective-C 类实例是一个 C 结构,添加了额外的通信层,但是当您使用箭头时,该通信层基本上被绕过了。例如,如果你打开 Xcode 并输入 [UIApplication sharedApplication]->
然后调出方法完成列表,你会看到:
在这里你可以看到一堆我们通常使用方括号语法访问的普通字段(如[[UIApplication sharedApplication] delegate]
)。然而,这些特定的项目是 C
字段,用于存储它们各自的 Objective-C 属性的值。
所以,你大致可以这样想:
C 对象上的点运算符
C 对象(指针)上的箭头运算符
Objective-C 对象(指针)上的点运算符/方括号
objc_msgSend
Objective-C 对象(指针)上的箭头运算符
现在我在这里肯定过于简单化了,但总结一下:箭头运算符在两种情况下看起来基本相同,但点运算符在 Objective-C 中具有额外/不同的含义。
关于objective-c - 点 (".") 运算符和箭头 ("->") 运算符在 C 与 Objective-C 中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9072688/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!