parameter-passing - 如何按值传递对象?

标签 parameter-passing pass-by-reference d 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."
}

在 D 中,引用与值是类型的特征,而不是函数参数的特征。来自 C++,这对我来说真的很糟糕。

看起来有一个 ref关键字来强制接受函数的引用传递 struct s。是否有这样的等价通过class按值(value)计算?

例如,假设我想创建一个返回自定义容器类的排序副本的函数。在 C++ 中,这就像使用 Foo Sorted(Foo Object) 一样简单,而不是 Foo Sort(Foo& Object) .如果不手动复制对象,我认为无法在 D 中执行此操作。

最佳答案

类是设计上的引用类型。它们不应该通过值传递。这与 Java 和 C# 完全相同。但是,与 Java 和 C# 不同的是,D 也具有成熟的用户定义值类型,因为它具有结构(C# 也具有结构,但它们的限制要大得多)。 C++ 将两者混为一谈的事实会导致诸如 object slicing 之类的问题。 .

现在,显然有时您想要复制引用类型。解决方案是 cloning .你给你的类(class)一个 clone函数返回它被调用的对象的副本。这样,您可以在需要时复制它,并且仅在需要时才复制它。 Java 和 C# 有一个标准 clone大多数类型实现的函数,但出于某种原因 D 没有实现。我不知道为什么。但是自己为自己的类型声明这样的函数仍然很容易。它只是不会在 Object 上,这将允许您在几乎任何类对象上使用它,而无需关心您可以在 Java 和 C# 中执行的实际类型。如果你愿意,你总是可以创建一个复制构造函数,但它不太灵活,因为你必须知道被复制的对象的类型,而使用 clone ,它可以是派生自 clone 的类型的任何类型。返回(在 Java 和 C# 的情况下是 Object,但可以是你在 D 中决定的任何内容,因为该函数是非标准的)。

关于parameter-passing - 如何按值传递对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7549338/

相关文章:

postgresql - 月份和年份而不是日期变量

c# - 如何将多个参数动态传递到 Asp .Net MVC 中的 Html.Action

c++ - 如何创建可以影响通过构造函数传递的对象的类变量?

c++ - 重载 << 时返回对局部变量的引用

d - 如何声明分配给 File.byLine() 的变量?

time - 快速的跨平台计时器?

python - Python 给函数参数赋值的过程是怎样的?

c++ - 调用一个类的构造函数,被多个类继承

c# - 将 C# 7.2 'in' 参数修饰符放在各处是否有用

c - d2 : Parameter storage class interoperability with functions implemented outside of D