考虑:
class B
{
public:
int i = 4;
}
class A
{
public:
B b;
this()
{
b = new B;
}
ref B f()
{
return b;
}
}
成员函数f
前面的ref存储类是多余的吧?类对象总是通过引用传递,所以返回B
和ref B
是等价的吗?
第二:纯
成员函数?纯函数是只返回依赖于参数的东西。因此,它不应该依赖于类的任何数据成员,因为即使传入相同的参数,它们也可能改变函数的输出。因此,pure
成员函数也是 static
成员函数? (反之亦然)
第三:const和不可变成员类有什么区别?区分不可变和常量类对象的成员函数调用?从语义上讲,我们不能同时更改具有这两个属性的数据成员,对吧?
第四:我应该添加尽可能多的函数属性吗?像 pure
、const
或 immutable
、nothrow
和 final
?
太棒了,刚刚发现这个作品:
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
引用因此可以作为不可变参数传递给另一个函数,或分配给不可变变量。
在决定何时关心 const
、immutable
、pure
和 nothrow
时,必须考虑是否不是您实际上需要客户端代码中的这些各种保证。如果您正在编写一个通用库,您可能不知道这一点,因此在这些情况下,最好提供尽可能多的保证。
final
的情况可以说是不同的。当您不希望客户端代码意外覆盖一个没有意义的函数或不打算被覆盖的函数时,或者当您希望为编译器提供更多机会来优化对该函数的调用时,请使用它。不覆盖任何函数(使用override
)且不实现任何接口(interface)函数的最终函数不必是虚函数,从而减少调用开销。
关于class - D 成员函数属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8635396/