gpt4 book ai didi

c++ - Objective-C 和 C++ 之间的转换比较

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:12 25 4
gpt4 key购买 nike

好的,所以这可能是一个学术问题。谁能告诉我 C++ 的转换运算符是否/如何转换为 Objective-C...或者它们如何/为什么不需要?

我已经脱离 C++ 的圈子几年了,似乎每次我转身他们都会添加一些新的关键字。我最近了解到 C++ 的各种转换运算符 reinterpret_cast、static_cast、dynamic_cast 和 const_cast。我不太清楚何时会出现需要使用所有这些类型的强制转换的情况。

我现在已经使用 Objective-C 一两年了,对它感觉相当舒服。 (在那之前主要是 C 人)。我试图理解为什么 C++ 似乎具有所有这些复杂性。或者换句话说,Objective-C 缺少什么它似乎没有(或不需要?)这么多的转换类型?

最佳答案

参见 this answer to the question When should static_cast, dynamic_cast and reinterpret_cast be used?关于各种类型转换的含义。

what's Objective-C missing that it doesn't seem to have (or need?) this many casting types?

C++ 比 C 更注重类型安全。The many cast operators are added to make the many different casting intentions clear (并且由于其丑陋的形式而阻止人们使用它)。而且,

  • Objective-C中没有常量对象(const NSObject*),其他const参数也不像C++那样强调,所以const_cast没用。

  • Objective-C 实例始终使用动态类型,因此不需要 dynamic_cast。 (ObjC 中的类型检查通常使用 -isKindOfClass: 完成。)

  • static_castreinterpret_cast 在 C 中是相同的,但在 C++ 中则不同。因为 C++ 支持多重继承(在 ObjC 中缺失),指针转换不像空操作那么简单:

    #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
    }

关于c++ - Objective-C 和 C++ 之间的转换比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3147156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com