Dan*_*ung 5 c++ casting objective-c
好的,所以这可能是一个学术问题.有人能告诉我C++的投射操作符是否/如何转换为Objective-C ...或者如何/为什么它们没有必要?
我已经离开了几年的C++循环,似乎每次我转身他们添加一些新的关键字.我最近介绍了C++的各种转换操作符reinterpret_cast,static_cast,dynamic_cast和const_cast.当这些情况出现时你需要使用所有这些类型的演员表时,我有点模糊.
我已经使用Objective-C一两年了,对它感觉相当舒服.(直到那时候大部分都是C人).我试图理解为什么C++似乎具有所有这些复杂性.换句话说,什么是Objective-C缺少它似乎没有(或需要?)这么多的铸造类型?
见这个问题的答案应该什么时候static_cast,dynamic_cast和reinterpret_cast使用?关于每种演员的意义.
什么是Objective-C缺少它似乎没有(或需要?)这么多的铸造类型?
C++更注重类型安全而不是C. 许多演员操作符被添加以使许多不同的演员意图清晰(并且由于其丑陋的形式而阻止人们使用它).和,
const NSObject*在Objective-C中没有const对象(),并且与C++不同,其他const参数没有那么强调,因此const_cast没用.
Objective-C实例总是使用动态类型,因此dynamic_cast不需要.(ObjC中的类型检查通常是使用-isKindOfClass:.)
static_cast并且reinterpret_cast在C中是相同的,但在C++中却不是这样.因为C++支持多重继承(ObjC中缺少),所以指针转换并不像no-op那么简单:
#include <cstdio>
struct A {
int x;
A() : x(12) {}
};
struct B {
int y;
B() : y(33) {}
int get() const { return y; }
};
struct C : A, B {
int z;
C() : A(), B(), z(41) {}
};
int main () {
C* c = new C;
printf("%d\n", c->get()); // 33
printf("%d\n", static_cast<B*>(c)->get()); // 33
printf("%d\n", reinterpret_cast<B*>(c)->get()); // 12
}
Run Code Online (Sandbox Code Playgroud)