今天有一同学问我,java怎么没有拷贝构造函数呢,java的clone就是c++的拷贝构造
函数么?
下面我分析一下这个问题:
而java中的clone是c++中的拷贝构造函数么?事实上并不是这样的,java是在
语言层面对prototype模式的支持。java事实上很少需要拷贝,除非你需要显示的得到
对象的拷贝。因为java中从来都不会有显示的对象,对象都是由引用来持有,所以无论
是你在试图传递对象或把对象作为返回值,实际传递或返回的是引用,所以生成的副本
都是引用本身,这个特点从根本上避免了对象无谓的生成副本和对拷贝构造函数的需要。
而c++是有显示对象对象存在的,我们经常一不小心把对象毫无意义的生成了副本,甚至
由此造成自己觉诡异的错误,有一次给同学调试n长的c++程序,发现他的程序中大量充满这样的代码:
void f(Point x){
//some operation to x
}
并且试图多个函数对同一个Point进行操作,一眼就能看出肯定会出问题的,因为对对象的所有操作都不会反映在实参,你一直在操作对象的拷贝---another object。
拷贝构造函数面临的另一尴尬问题时,成员中存在指针数组的情况下:
class Person{
//...
};
class Student: public Person{
//..
};
class Teacher: public Person{
//...
};
class A{
//...
private:
Person *p[8];
};
当我们试图去深拷贝A的对象时,拷贝构造函数显得无能为力,因为构造函数是不支持多态
的,这就需要我们去显示的实现prototype模式,在Person的继承体系下实现clone函数:
class Person{
public :
virtual Person *clone(){
return new Person(this);
}
//...
};
class Student: public Person{
Person *clone(){
return new Student(this);
}
//..
};
class Teacher: public Person{
Person *clone(){
return new Teacher(this);
}
//...
};
这样我们只需要在class A的拷贝构造函数中使用clone,就可以了完成我们的深拷贝任务了。但c++这种没有单根继承的情况下,是不可能从语言级别提供prototype模式的支持的。
结论:java根本不需要拷贝构造函数,java的clone方法是原型(prototype)模式的在
语言层面的支持,同时为需要显式的拷贝提供了支持。
分享到:
相关推荐
然而,由于`clone`的复杂性和容易出错,许多开发者更倾向于使用`copy-constructor`或者`Builder`模式来创建对象的副本,这两种方式更加直观和可控。 总结来说,Java中的`clone`方法是一种快速创建对象副本的手段,...
Java 反射之 Constructor Java 反射机制中的 Constructor 类提供了关于类的单个构造方法的信息,包括对它的访问权限、Class 获取构造函数的方式等。下面将详细讲解 Constructor 类的概述、获取构造函数的方式、构造...
因此,有时候会使用`copy-constructor`(拷贝构造函数)或`Builder`模式来替代`clone`,它们可以提供更清晰的代码结构和更可控的复制行为。 总结一下,Java中的`clone`方法是实现对象复制的一种方式,涉及到浅拷贝...
例如,可以使用序列化和反序列化,或者使用`CopyConstructor`(一个带原有对象作为参数的构造器)来实现对象的复制。 7. **注意事项**: - 如果对象中包含不可克隆的字段(如`final`字段),`clone()`方法可能无法...
在C++编程语言中,复制构造函数(Copy Constructor)和赋值运算符(Assignment Operator)是两个非常关键的概念,特别是在处理对象的拷贝和赋值时。它们默认由编译器提供,但通常需要根据具体需求进行自定义,以确保正确...
在标签"java clone()"中,我们可以推断这篇博客可能还讨论了关于Java中对象复制的各种策略,如序列化和反序列化,以及`CopyConstructor`,这些都是创建对象副本的替代方法,特别是当`clone()`不能满足特定需求时。...
1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator: method 'void ()' not found at org.jetbrains.idea.maven.server.embedder....
在深入探讨Java反射机制中`Constructor`、`Method`、`Field`以及`Class`类的使用之前,我们需要先了解反射的基本概念及其重要性。反射是Java的一项强大功能,它允许程序在运行时检查类和对象的结构,甚至可以创建和...
RTTR通过提供一种预编译的机制,使得C++开发者也能享受到类似于Java或C#等语言的反射功能,而无需破坏类的继承结构。 RTTR的工作原理主要基于元数据(metadata)和元对象(meta objects)。它允许你在编译时对类、...
在Java中,当我们使用`clone()`方法或`System.arraycopy()`进行复制时,通常得到的是浅复制的结果。这意味着原始对象和复制对象中的引用指向内存中的同一块区域。如果List中的元素是基本类型,这种复制方式是没问题...
### Java 高级特性详解 #### 一、`hashCode` ...正确地重写 `equals` 和 `hashCode` 方法、使用 `Comparator` 进行排序、利用反射机制和序列化技术,以及实现 `clone` 方法都是开发高质量 Java 应用程序的重要技能。
1. 类与对象:与C++相似,Java也是面向对象的,通过类定义对象,并使用构造器(constructor)初始化对象。 2. 异常处理:Java使用try-catch-finally语句来处理程序运行时可能出现的异常。 3. 内存管理:Java的垃圾...
Inside the C++ Object Model focuses on the underlying mechanisms that support object-oriented programming within C++: constructor semantics, temporary generation, support for encapsulation, ...
我们定义了三个构造函数,分别是default constructor、parameterized constructor和copy constructor。析构函数用于释放动态数组p的内存。 3. 输入函数: 输入函数用于读取用户输入的多项式信息,包括多项式的次数...
课件部分通常包括PPT或者PDF等形式,涵盖了C++的基础语法、数据类型、控制结构、函数、类与对象的定义、构造函数与析构函数、拷贝构造函数(Copy Constructor)、运算符重载、模板、异常处理等内容。通过课件,学生...
多文件编程、拷贝构造(Copy Constructor)以及this指针的意义和作用都为学习者构建了面向对象编程的完整视图。 最后,王老师通过内联函数的语法和评价、类型转换的不同方式、命名空间的使用以及系统string类的知识...
重庆大学C++考试试卷解析 本资源为重庆大学C++考试试卷,涵盖面向...本资源涵盖了C++中的多个知识点,包括引用、指针、晚绑定、copy constructor、访问修饰符、名字装饰、函数调用、变量作用域、类的继承和多态等。
2.2 Copy Constructor的建构操作 Default Memberwise Initialization Bitwise Copy Semantics(位逐次拷贝) 不要Bitwise Copy Semantics! 重新设定的指针Virtual Table 处理Virtual Base Class Subobject 2.3 程序...
Classes Doing Work in Constructors Default Constructors Explicit Constructors Copy Constructors Structs vs. Classes Inheritance Multiple Inheritance Interfaces Operator Overloading Access Control ...