如何按值传递对象?

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中决定的是什么,因为函数是非标准的).