我不了解复制构造函数的详细工作方式

I don't get how copy constructors work in detail

这段代码的用途是什么?

public Fraction(Fraction other) {
    num = other.num; 
    denom = other.denom; 
}

如果你有这样的构造器:

public Fraction(int n, int d) {
    num = n;
    denom = d;
}

为什么要将other.num初始化为num,将other.denom初始化为denom。复制构造函数的语法是什么?目的是什么?

使用起来方便多了


如果您有一个简单的构造函数,例如:

public Fraction(int n, int d) {
    num = n;
    denom = d;
}

您可以使用以下代码复制实例原件:

Fraction copy = new Fraction(original.num, original.denom);

使用复制构造函数时执行以下调用:

Fraction copy = new Fraction(original);

如果你有很多参数,这会更方便。当您更改构造函数或对象的参数时会发生什么?如果没有复制构造函数,您必须更改所有此类调用。


来自 M 的值得注意的事实。 Prokhorov 的 评论:

There is no special syntax for copy constructors, they are just logical style of implementing a parameterized constructor.

使用复制构造函数而不是传递所有参数的构造函数有两个很好的理由:

  1. 当我们有一个具有许多属性的复杂对象时,使用复制构造函数会很方便
  2. 如果我们向现有的 class 添加一个属性,那么我们可以只更改复制构造函数以考虑这个新属性,而不是更改每个出现的其他构造函数

如果您只输入

public Fraction(Fraction other) {
}

Java 不会简单地猜测您想将 other 的值复制到新对象中。 Java 不会像那样自动为您初始化变量。要使其成为复制构造函数,您仍然必须手动输入将字段从 other 复制到您正在创建的对象的代码。像这样:

public Fraction(Fraction other) {
    num = other.num; 
    denom = other.denom; 
}

构造函数创建了一个新的 Fraction,但正是您在其中键入的代码手动执行 "copying",使其成为 "copy constructor" 并允许您执行

Fraction a = Fraction(4, 20);
Fraction b = new Fraction(a); 
// b has the same values as a but is a different object

当然,如果你已经有另一个构造函数,制作拷贝构造函数的更简单的方法是

public Fraction(int n, int d) {
    num = n; 
    denom = d; 
}

public Fraction(Fraction other) {
    this(other.num, other.denom);
}

如果您有 Fraction 对象的 实例 ,例如:

Fraction fr = new Fraction(1, 2); //represents 1/2

当然你可以复制它,只需将它分配给一个新变量即可:

Fraction copy = fr;

但是现在,frcopy 都指向同一个对象(内存中的同一个位置)。如果由于某种原因,copy 变为 1/3,则 fr 也会发生变化。 有时您想要原始对象的全新副本。这就是写起来非常方便的地方:

Fraction copy = new Fraction(fr);

现在您可以独立操作 copyfr,而不必担心其中任何一个发生不必要的更改。

您可以阅读 this 教程以获得有关该主题的更深入的信息。