gpt4 book ai didi

class - D 成员函数属性

转载 作者:行者123 更新时间:2023-12-01 08:36:54 24 4
gpt4 key购买 nike

考虑:

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/

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