在Objective-C和C++之间进行比较

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缺少它似乎没有(或需要?)这么多的铸造类型?

ken*_*ytm 9

见这个问题的答案应该什么时候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)

  • _"static_cast和reinterpret_cast在C中是一样的"_?我不知道C有`static_cast`和`reinterpret_cast`. (2认同)