class - D 成员函数属性

标签 class attributes d

考虑:

class B
{
public:
    int i = 4;
}

class A
{
public:
    B b;

    this()
    {
        b = new B;
    }

    ref B f()
    {
        return b;
    }
}

成员函数f前面的ref存储类是多余的吧?类对象总是通过引用传递,所以返回Bref B是等价的吗?

第二:成员函数?纯函数是只返回依赖于参数的东西。因此,它不应该依赖于类的任何数据成员,因为即使传入相同的参数,它们也可能改变函数的输出。因此,pure 成员函数也是 static 成员函数? (反之亦然)

第三:const和不可变成员类有什么区别?区分不可变和常量类对象的成员函数调用?从语义上讲,我们不能同时更改具有这两个属性的数据成员,对吧?

第四:我应该添加尽可能多的函数属性吗?像 pureconstimmutablenothrowfinal


太棒了,刚刚发现这个作品:

inout(B) f() inout
{
    return b;
}

最佳答案

ref B f() 是一个通过引用返回 B 的函数。 B 是类引用。因此,它通过引用返回一个类引用。这在D中不是废话,因为类引用是可以反弹的:

auto a = new A;
a.f() = new B; // rebinds a.b, possible due to return by ref

同样,你也可以在 D: 中拥有指向类引用的指针:

class A
{
    B b;

    /* ... */

    B* f()
    {
        return &b;
    }
}

auto a = new A;
B* b = a.f(); // pointer to reference to instance of class B
*b = new B; // updates a.b

对于 pure 成员函数,隐式 this 引用参数就是这样 - 另一个参数。它被认为是输入的一部分。使用相同的 this 对象和相同的常规参数,输出仍然始终相同。


使用 const 成员函数,您不知道 this 对象是可变的还是不可变的。它可能是 - const 成员函数 promise 无论如何都不会改变它。使用 immutable 成员函数,this 对象始终是不可变的。 this 引用因此可以作为不可变参数传递给另一个函数,或分配给不可变变量。


在决定何时关心 constimmutablepurenothrow 时,必须考虑是否不是您实际上需要客户端代码中的这些各种保证。如果您正在编写一个通用库,您可能不知道这一点,因此在这些情况下,最好提供尽可能多的保证。

final 的情况可以说是不同的。当您不希望客户端代码意外覆盖一个没有意义的函数或不打算被覆盖的函数时,或者当您希望为编译器提供更多机会来优化对该函数的调用时,请使用它。不覆盖任何函数(使用override)且不实现任何接口(interface)函数的最终函数不必是虚函数,从而减少调用开销。

关于class - D 成员函数属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8635396/

相关文章:

perl - 在使用 ("Server1"时不能使用字符串 "strict refs") 作为 SCALAR ref

python - 理解 python 描述符示例 (TypedProperty)

c++ - 如何有条件地实例化一个对象?

ios - swift3、Xcode 8.3 导航设置 titleTextAttributes 失败

string - 用C样式的字符串调用C函数

c - 为什么这个函数被视为委托(delegate)?

Java,反编译器出现问题

java - 如何检查未设置的对象是否具有属性

python - 更新多个属性python

d - 我可以使用什么编译器将 C++ 与 D 链接?