Objective C 的 self 和 C++ 的 this 有何不同?

10

有人能告诉我 Objective-C 的 self 和 C++ 的 this 指针有什么区别吗?


你的Objective-C和C++引用告诉了你什么? - GManNickG
可能是在Objective-C中给自己赋值的重复问题。 - Kirill V. Lyadvinsky
3
这并不是那个问题的重复。那里的问答者已经明白了这个问题的答案。 - JeremyP
2个回答

23
主要区别在于this是一个关键字,而self是一个变量。这样做的结果是,虽然this始终指向执行特定方法的对象,但Objective-C方法在执行过程中可以自由修改self。这有时被构造函数使用,当失败时设置self = nil
这样做的原因是:
  • 子类(通过self = [super init]链接初始化器)可以看到初始化失败并知道不要在它们自己的初始化器中继续。
  • 组合对象可以看到失败并知道它们没有有效的组件。
一些初始化器将self设置为不同但有效的对象。这可以在类簇中使用,在构建初始化对象时,“抽象”类可以生成临时实例,但最终返回基于构建过程中建立的属性的不同对象。
此外,这意味着您可以像使用变量名一样使用关键字,这会让每个人都感到困惑,例如在代码块中定义具有相同名称self的更局部变量。

在C++中,您可以修改this的值。并不是说您应该这样做,但我曾经看到它被用于在32位指针没有完全被内存映射使用的系统上打包一些额外信息... - jv42
@jv42:我的编译器不允许这样做,除非设置一个选项,所以我认为它要么是非标准的,要么是过时的。 - user23743
1
@jv42:this 是一个 rvalue,它不能被修改。 - GManNickG

6

是的。其中一个拼写为s-e-l-f。另一个拼写为t-h-i-s。

不那么幽默地说:

self用于Objective-C类中,表示指向当前实例的指针。

this用于C++类中,表示指向当前实例的指针。

它们在完全不同的结构上执行类似的角色。


@Preet Sangha: 在回答中加一个笑话有什么不妥吗? - JeremyP
哈哈,我写了个笑话,因为我懒得查一下“facetiously”的拼写,所以把它删掉了。回答你的问题,什么都没有。 - Preet Sangha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接