This is something I have wondered for a long time. Take the following example:
struct matrix { float data[16]; };
I know what the default constructor and destructor do in this specific example (nothing), but what about the copy constructor and the copy assignment operator?
struct matrix { float data[16]; // automatically generated copy constructor matrix(const matrix& that) : // What happens here? { // (or here?) } // automatically generated copy assignment operator matrix& operator=(const matrix& that) { // What happens here? return *this; } };
Does it involve std::copy
or std::uninitialized_copy
or memcpy
or memmove
or what?
C and C++ don't have "deep copy" and "shallow copy" specifically. Instead they have member-wise copy. You could call this "shallow" if the member is a pointer or resource handle, and "deep" if the member is an array or a resource handler which has a copy-constructor that duplicates the resource.
CopyTo copies all the elements of the current array to the specified destination array. This method should be called from the source array and it takes two parameters. The first being the array you want to copy to, and the second parameter tells it what index of the destination array it should start copying into.
Copy(Array, Array, Int32) Copies a range of elements from an Array starting at the first element and pastes them into another Array starting at the first element. The length is specified as a 32-bit integer.
Arrays are not assignable. You cannot use an array type variable as LHS operand of assignment operator. An assignment operator shall have a modifiable lvalue as its left operand.
This is what the standard says in 12.8 (Copying class objects). Copy construction:
Each subobject is copied in the manner appropriate to its type:
- if the subobject is of class type, the copy constructor for the class is used;
- if the subobject is an array, each element is copied, in the manner appropriate to the element type;
- if the subobject is of scalar type, the built-in assignment operator is used.
Copy assignment:
Each subobject is assigned in the manner appropriate to its type:
- if the subobject is of class type, the copy assignment operator for the class is used (as if by explicit qualification; that is, ignoring any possible virtual overriding functions in more derived classes);
- if the subobject is an array, each element is assigned, in the manner appropriate to the element type;
- if the subobject is of scalar type, the built-in assignment operator is used.
Both copies elements in the array (instead of doing nothing or copying pointer).
struct X { char data_[100]; }; int main () { X orig, copy_assign; orig.data_[10] = 'a'; copy_assign = orig; X copy_constructor(orig); printf("orginal10:%c, copy_assign10:%c, copy_constructor10:%c\n",orig.data_[10],copy_assign.data_[10],copy_constructor.data_[10]); copy_assign.data_[10] = 'b'; printf("original10:%c, copy_assign10:%c, copy_constructor10:%c\n",orig.data_[10],copy_assign.data_[10],copy_constructor.data_[10]); copy_constructor.data_[10] = 'c'; printf("original10:%c, copy_assign10:%c, copy_constructor10:%c\n",orig.data_[10],copy_assign.data_[10],copy_constructor.data_[10]); return 0; }
running results:
orginal10:a, copy_assign10:a, copy_constructor10:a original10:a, copy_assign10:b, copy_constructor10:a original10:a, copy_assign10:b, copy_constructor10:c
Hope this example is clear.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With