`
leonzhx
  • 浏览: 794130 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Copy constructors

 
阅读更多

Copy constructors :

  • provide an attractive alternative to the rather pathological clone method
  • are easily implemented
  • simply extract the argument's data, and forward to a regular constructor
  • are unnecessary for immutable objects

Example

public final class Galaxy {

  public Galaxy (double aMass, String aName) {
     fMass = aMass;
     fName = aName;
  }

  /**
  * Copy constructor.
  */
  public Galaxy(Galaxy aGalaxy) {
    this(aGalaxy.getMass(), aGalaxy.getName());
    //no defensive copies are created here, since 
    //there are no mutable object fields (String is immutable)
  }

  /**
  * Alternative style for a copy constructor, using a static newInstance
  * method.
  */
  public static Galaxy newInstance(Galaxy aGalaxy) {
    return new Galaxy(aGalaxy.getMass(), aGalaxy.getName());
  }

  public double getMass() {
    return fMass;
  }

  /**
  * This is the only method which changes the state of a Galaxy
  * object. If this method were removed, then a copy constructor
  * would not be provided either, since immutable objects do not
  * need a copy constructor.
  */
  public void setMass( double aMass ){
    fMass = aMass;
  }

  public String getName() {
    return fName;
  }

  // PRIVATE /////
  private double fMass;
  private final String fName;

  /**
  * Test harness.
  */
  public static void main (String... aArguments){
    Galaxy m101 = new Galaxy(15.0, "M101");

    Galaxy m101CopyOne = new Galaxy(m101);
    m101CopyOne.setMass(25.0);
    System.out.println("M101 mass: " + m101.getMass());
    System.out.println("M101Copy mass: " + m101CopyOne.getMass());

    Galaxy m101CopyTwo = Galaxy.newInstance(m101);
    m101CopyTwo.setMass(35.0);
    System.out.println("M101 mass: " + m101.getMass());
    System.out.println("M101CopyTwo mass: " + m101CopyTwo.getMass());
  }
} 



Example run of this class :

>java -cp . Galaxy
M101 mass: 15.0
M101Copy mass: 25.0
M101 mass: 15.0
M101CopyTwo mass: 35.0

 

This article originates from http://www.javapractices.com/topic/TopicAction.do?Id=12

分享到:
评论

相关推荐

    Copy Constructors and Assignment Operators终极解释

    在C++编程语言中,复制构造函数(Copy Constructor)和赋值运算符(Assignment Operator)是两个非常关键的概念,特别是在处理对象的拷贝和赋值时。它们默认由编译器提供,但通常需要根据具体需求进行自定义,以确保正确...

    operator overloading and copy constructors 英文原版

    复制构造函数在C++中涉及到两种复制类型:浅复制(shallow copy)和深复制(deep copy)。浅复制仅仅复制对象的指针,导致多个对象指向相同的内存区域,这在复制包含指针的复杂对象时会引起问题。深复制则复制指针所...

    Google C++ Style Guide(Google C++编程规范)高清PDF

    Classes Doing Work in Constructors Default Constructors Explicit Constructors Copy Constructors Structs vs. Classes Inheritance Multiple Inheritance Interfaces Operator Overloading Access Control ...

    c++官方网站标准参考资料

    Copy constructors, assignment operators, and exception safe assignment, How to use tags, Converting numbers to strings and strings to numbers, How To: Ask Questions The Smart Way ), Forum( 说明:...

    深入C++对象模型的读书笔记

    2. **拷贝构造函数(Copy Constructors)**: - 如果用户未定义拷贝构造函数,编译器会合成一个。有两种类型:trivial和nontrivial。 - Trivial拷贝构造函数进行逐位复制,适用于内置类型。 - 非trivial拷贝构造...

    C++编码规范

    明确的构造函数(Explicit Constructors)防止了不必要的类型转换,拷贝构造函数(Copy Constructors)负责对象的浅拷贝。 结构体(Structs)和类(Classes)虽然在C++中非常相似,但它们在成员访问权限上有所不同...

    Packt.Swift.Functional.Programming.2nd.Edition.2017

    Understand the importance of immutability, copy constructors, and lenses Develop a backend API with Vapor Create an iOS app by combining FP, OOP, FRP, and POP paradigms In Detail Swift is a multi-...

    Google_CPP_编程规范.pdf

    - 拷贝构造函数(Copy Constructors):拷贝构造函数用于创建一个新对象作为现有对象的副本,应当注意避免浅拷贝问题。 - 结构体与类(Structs vs. Classes):结构体和类在C++中本质上是相同的,但默认的访问控制...

    Google C++ Style Guide 3.180版(最新版)

    - **Copy Constructors**:深拷贝与浅拷贝的选择依据是对象是否包含指针或引用类型的成员变量。深拷贝可以避免对象间数据意外共享的问题。 - **Structs vs. Classes**:结构体(struct)通常用于表示简单数据类型,而...

    C++ Style Guide.pdf

    - **Copy Constructors**:深拷贝与浅拷贝的选择,以及正确实现复制构造函数。 - **Structs vs. Classes**:根据数据封装需求选择struct或class。 - **Inheritance**:继承的适当使用与滥用的避免。 - **Multiple ...

    Swift Functional Programming - Second Edition

    Understand the importance of immutability, copy constructors, and lenses Develop a backend API with Vapor Create an iOS app by combining FP, OOP, FRP, and POP paradigms In Detail Swift is a multi-...

    谷歌_C++编码风格指南

    - **复制构造函数(Copy Constructors)**:为类提供复制构造函数以处理对象的深拷贝和浅拷贝问题。 - **赋值运算符(Operator=)**:实现赋值运算符时,遵循自赋值安全原则,并确保正确处理资源管理。 4. **谷歌经验...

    Google C++ Style Guide

    #### Copy Constructors(拷贝构造函数) - 分析拷贝构造函数的必要性,特别是在资源管理方面的作用。 #### Structs vs. Classes(结构体与类的区别) - 对比结构体与类在内存布局、默认访问权限等方面的差异,...

    Google_C++_Style_Guide

    15. **Copy Constructors**:复制构造函数应处理深拷贝和浅拷贝问题,遵循“Rule of Three”。 16. **Structs vs. Classes**:根据数据封装程度选择struct或class,struct默认为public,class默认为private。 17. ...

    google编程风格手册

    - **Copy Constructors**: 深拷贝与浅拷贝的区别及何时使用。 - **Struct vs. Classes**: 在C++中,struct和class的主要区别在于默认的访问级别,struct默认为public而class默认为private。 - **Inheritance**: ...

    Google C++ 编程规范(精心制作的链接文档-方便查看学习)

    - **Copy Constructors**:深拷贝和浅拷贝的区别以及何时使用哪种拷贝方式是重要的考虑因素。 - **Structs vs. Classes**:结构体(struct)和类(class)在C++中有不同的默认访问级别,应根据实际需求选择合适的...

    关于VC++学习的基础知识

    - **Copy Constructors**:拷贝构造函数用于复制对象时创建新对象。 - **Structs vs. Classes**:在C++中,struct和class的主要区别在于默认访问级别不同。struct的默认访问级别为public,而class的默认访问级别为...

Global site tag (gtag.js) - Google Analytics