【问题标题】:Why isn't opAssign overloadable for classes?为什么 opAssign 不能为类重载?
【发布时间】:2012-01-14 12:55:59
【问题描述】:

This table 表示 assignment overloading 仅适用于结构,而不适用于类。这让我很惊讶。 A = B 的语法糖不是无害的吗?将其限制为结构的设计原理是什么?

【问题讨论】:

    标签: operator-overloading d assignment-operator design-rationale


    【解决方案1】:

    D 类具有引用语义。如果您想要一种获取对象副本的方法(它认为),标准或常规的做法是提供 .dup 属性。

    【讨论】:

    • 我不相信此时真的有一个标准,但.dup 将是一种常见的方法,如果我们决定一个实际的标准,那么这将是可能的选择。
    • 哪个使用 postblit,你可以在你的类中通过 this(this) {} 来定义。它是post-blit,所以所有变量都被复制了,你只需要对类中的指针变量进行处理。例如,通过复制它们。
    • @JonathanMDavis:标准的正常,而不是 ISO 的标准。 :o)
    • @BCS 我的意思是标准,甚至普遍认为这是这样做的方式。我认为这甚至不一定是大多数 D 用户所做的事情。这很常见,如果要达成一项普遍协议,那么很有可能就是这样,但 AFAIK 目前还没有这样的普遍协议。
    • @Daevius 类没有 postplit 构造函数。它们用于结构,而不是类。没有内置方法可以复制类的内容。您必须创建一个返回副本的函数或创建一个复制构造函数——它不像在 C++ 中那样被特殊对待;它只是一个构造函数,它采用与正在构造的类相同类型的类。通常,此类函数将命名为 dupclone,但只有数组具有内置的 dup 属性。任何其他类型都必须有一个用户定义的类型。
    【解决方案2】:

    我会提交一个错误,and did。一般规则是The D Programming Language,DMD 实施,网站。由于我手边没有 TDPL,因此我将对此进行实施。

    class A {
        int a;
        string b;
        float c;
    
        void opAssign(B b) {
           a = b.a;
        }
    }
    
    class B {
        int a;
    }
    void main()
    {
        auto a = new A();
        a.a = 5;
        auto b = new B();
        b.a = 10;
        a = b;
    
        assert(a.a == 10);
    }
    

    【讨论】:

      【解决方案3】:

      在 D 中,类是通过引用使用的。因此,当您执行 A = B 时,您不会复制对象本身,而只是对该对象的引用。

      在此过程中没有对象被修改。所以为这些定义 opAssign 是没有意义的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        • 2010-10-10
        • 2015-11-13
        • 1970-01-01
        相关资源
        最近更新 更多