gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:55:48 24 4
gpt4 key购买 nike

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/

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