为了账号安全,请及时绑定邮箱和手机立即绑定

我不明白复制构造函数的详细工作原理

我不明白复制构造函数的详细工作原理

12345678_0001 2023-08-16 18:17:56
这段代码的目的是什么?public Fraction(Fraction other) {     num = other.num;      denom = other.denom;  }如果你有这样的构造函数:public Fraction(int n, int d) {     num = n;     denom = d; }为什么必须初始化other.numtonum和other.denomto denom. 复制构造函数的语法是什么?什么目的?
查看完整描述

4 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

使用起来方便多了。


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

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 的评论中值得注意的事实:

复制构造函数没有特殊的语法,它们只是实现参数化构造函数的逻辑样式。


查看完整回答
反对 回复 2023-08-16
?
呼唤远方

TA贡献1856条经验 获得超11个赞

如果你只是简单地输入


public Fraction(Fraction other) {

}

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


public Fraction(Fraction other) {

    num = other.num; 

    denom = other.denom; 

}

构造函数创建一个新的Fraction,但您在其中键入的代码手动执行“复制”,使其成为“复制构造函数”并允许您执行以下操作


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);

}


查看完整回答
反对 回复 2023-08-16
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

如果您有一个对象实例,例如Fraction

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

当然,您可以通过将其分配给新变量来复制它:

Fraction copy = fr;

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

Fraction copy = new Fraction(fr);

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

查看完整回答
反对 回复 2023-08-16
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

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

  1. 当我们有一个具有许多属性的复杂对象时,使用复制构造函数很方便

  2. 如果我们向现有类添加一个属性,那么我们只需更改复制构造函数以考虑此新属性,而不是更改其他构造函数的每次出现


查看完整回答
反对 回复 2023-08-16
  • 4 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信