Max*_*xpm 7 d parameter-passing pass-by-reference pass-by-value
import std.stdio;
class IntegerContainer
{
public int Integer = 1;
}
void DoubleInteger(IntegerContainer Container)
{
Container.Integer *= 2;
}
void main()
{
IntegerContainer Container = new IntegerContainer; // Internal integer defaults to one.
DoubleInteger(Container); // Internal integer changes to two inside the function.
writefln(Container.Integer); // Prints "2."
}
Run Code Online (Sandbox Code Playgroud)
在D中,引用与值是类型的特征,而不是函数参数.来自C++,这对我来说真的很糟糕.
看起来有一个ref关键字强制传递接受structs的函数的引用.是否有这样的等价物来传递class价值?
例如,假设我想创建一个返回自定义容器类的排序副本的函数函数.在C++中,这就像使用一样简单Foo Sorted(Foo Object),而不是Foo Sort(Foo& Object).在没有手动复制对象的情况下,我认为无法在D中执行此操作.
Jon*_*vis 11
类是设计的引用类型.它们不应该被价值所传递.它与Java和C#完全相同.然而,与Java和C#,d具有全面的用户定义的值类型为好,因为它具有结构(C#有结构太多,但他们多较为有限).C++将两者混合在一起会导致对象切片等问题.
现在,很明显存在的,当你想复制引用类型倍.解决方法就是克隆.你给你的类一个clone函数,它返回它所调用的对象的副本.这样,您可以在需要时复制它,并且只在需要时才复制它.Java和C#具有clone大多数类型实现的标准函数,但无论出于何种原因,D都没有.我不知道为什么.但是,为自己的类型自己声明这样的功能仍然很容易.它只是不会打开Object,这将允许你在几乎任何类对象上使用它,而不关心你在Java和C#中可以做的实际类型.如果您愿意,您可以随时创建一个复制构造函数,但它不太灵活,因为您必须知道要复制的对象的类型,而使用clone,它可以是从clone返回的类型派生的任何类型(将Object在Java和C#的情况,但是你在D中决定的是什么,因为函数是非标准的).