D成员函数属性

Tac*_*lff 3 attributes d class

考虑:

class B
{
public:
    int i = 4;
}

class A
{
public:
    B b;

    this()
    {
        b = new B;
    }

    ref B f()
    {
        return b;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

第三:const和不可变成员类之间的区别是什么?要区分不可变和const类对象的成员函数调用?在语义上它是相同的,因为我们不能用两个属性改变数据成员,对吧?

第四:我应该添加尽可能多的功能属性吗?喜欢pure,const或者immutable,nothrowfinal


太棒了,刚发现这个有用:

inout(B) f() inout
{
    return b;
}
Run Code Online (Sandbox Code Playgroud)

jA_*_*cOp 5

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

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

同样,您也可以在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
Run Code Online (Sandbox Code Playgroud)

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


使用const成员函数,您不知道该this对象是可变的还是不可变的.它可能是 - const成员函数承诺不会改变它.使用immutable成员函数,this对象始终是不可变的.因此,this引用可以作为不可变参数传递给另一个函数,或者分配给不可变变量.


当决定何时在意const,immutable,purenothrow,你必须考虑你是否真正在客户端代码需要这些不同的担保.如果你正在编写一个通用的库,你可能不知道这个,所以在这些情况下,最好提供尽可能多的保证.

情况可以说是不同的final.如果您不希望客户端代码意外覆盖无法覆盖的功能或者无意覆盖的功能,或者您希望为编译器提供更多机会来优化对该功能的调用,请使用它.不覆盖任何函数(带override)并且不实现任何接口函数的最终函数不必是虚函数,从而减少了调用开销.