Content deleted Content added
StuartMurray (talk | contribs) m changed int copy = null to int copy = 0, because the former is illegal in java 1.6 (and possibly earlier versions), also fixed a typo '<' becan '(' |
|||
(35 intermediate revisions by 30 users not shown) | |||
Line 1:
{{refimprove|date=August 2015}}
In [[computer science]], '''
==Shallow copies==
In
Copying primitive types in Java or [[C++]]:
<syntaxhighlight lang="java">
int original = 42;
int copy = 0;
copy = original;
</syntaxhighlight>
Many OOP programming languages (including [[Java (programming language)|Java]], [[D (programming language)|D]], [[ECMAScript]], and [[C Sharp (programming language)|C#]]) make use of object references. Object references, which are similar to pointers in other languages, allow for objects to be passed around by [[Pointer (computer programming)|address]] so that the whole object need not be copied.
A Java example, when "copying" an object using simple assignment:
<syntaxhighlight lang="java">
Object original = new Object();
Object copy = null;
copy = original▼
Object myObj = new Object();▼
copy = original; // does not copy object but only its reference
</syntaxhighlight>
The object is not duplicated, the variables 'original' and 'copy' are actually referring to the same object. In C++, the equivalent code
<syntaxhighlight lang="c">
Object* copy = NULL;
▲copy = original;
</syntaxhighlight>
makes it clear that it is a ''pointer'' to the object being copied, not the object itself.
==Cloning==
The process of actually making another exact replica of the object
Cloning an object in Java:
[[Category:Object-oriented programming]]▼
<syntaxhighlight lang="java">
Object originalObj = new Object();
Object copyObj = null;
copyObj = originalObj.clone(); // duplicates the object and assigns the new reference to 'copyObj'
</syntaxhighlight>→
C++ objects in general behave like primitive types, so to copy a C++ object one could use the '<code>=</code>' (assignment) operator. There is a default assignment operator provided for all classes, but its effect may be altered through the use of [[operator overloading]]. There are dangers when using this technique (see [[Object slicing|slicing]]). A method of avoiding slicing can be implementing a similar solution to the Java <code>clone()</code> method for the classes and using pointers. (There is no built-in <code>clone()</code> method.)
A C++ example of object cloning:
<syntaxhighlight lang="cpp">
Object originalObj;
Object copyObj(originalObj); // creates a copy of originalObj named copyObj
</syntaxhighlight>
A C++ example of object cloning using pointers (to avoid slicing see<ref>See Q&A at [http://en.allexperts.com/q/C-1040/constructor-virtual.htm en.allexperts.com] {{Webarchive|url=https://web.archive.org/web/20090718130949/http://en.allexperts.com/q/C-1040/constructor-virtual.htm |date=2009-07-18 }}</ref>):
<syntaxhighlight lang="cpp">
Object* originalObj = new Object;
Object* copyObj = nullptr;
copyObj = new Object(*originalObj); // creates a copy of originalObj and assigns its address to copyObj
</syntaxhighlight>
==References==
{{reflist}}
<!--Categories-->
▲[[Category:Object-oriented programming]]
|