Chapter 15-3 Pointers, Dynamic Data, and Reference Types
description
Transcript of Chapter 15-3 Pointers, Dynamic Data, and Reference Types
![Page 1: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/1.jpg)
1
Chapter 15-3
Pointers, Dynamic Data, and Reference
Types
Dale/Weems
![Page 2: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/2.jpg)
2
What happens . . .
When a function is called that passes a DynArray object by value, what happens?
?
?
75 ? ?
Private:
size 5
arr 2000
2000DynArray
Store
ValueAt
DynArray
~DynArray
CopyFrom
![Page 3: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/3.jpg)
3
// Function code
void SomeFunc(DynArray someArr)
// Uses pass by value
{
.
.
.
.
}
3
Passing a Class Object by Value
![Page 4: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/4.jpg)
4
By default, Pass-by-value makes a shallow
copy DynArray beta(5); // Client code . . .
SomeFunc(beta); // Function call
beta someArr
?
?
75 ?
?
2000DynArray
. . .
Private:
size 5
arr 2000
DynArray
. . .
Private:
size 5
arr 2000
shallow copy
![Page 5: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/5.jpg)
5
void SomeFunc(DynArray someArr)
// Uses pass by value
{
someArr.Store(290, 2);
.
.
.
}
What happens in the shallow copy scenario?
5
Suppose SomeFunc calls Store
![Page 6: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/6.jpg)
6
DynArray beta(5); // Client code . . .
SomeFunc(beta);
beta.arr[2] has changed
beta someArr
?
?
290 ?
?
2000DynArray
. . .
Private:
size 5
arr 2000
DynArray
. . .
Private:
size 5
arr 2000
shallow copy
![Page 7: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/7.jpg)
7
beta.arr[2] has changed
Although beta is passed by value, its dynamic data has changed!
beta someArr
?
?
290 ?
?
2000DynArray
. . .
Private:
size 5
arr 2000
DynArray
. . .
Private:
size 5
arr 2000
shallow copy
![Page 8: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/8.jpg)
8
Shallow Copy vs. Deep Copy
A shallow copy copies only the class data members, and does not make a copy of any pointed-to data
A deep copy copies not only the class data members, but also makes a separate stored copy of any pointed-to data
![Page 9: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/9.jpg)
9
What’s the difference?
A shallow copy shares the pointed to dynamic data with the original class object
A deep copy makes its own copy of the pointed to dynamic data at different locations than the original class object
![Page 10: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/10.jpg)
10
?
?
75 ?
?
4000DynArray
. . .
Private:
size 5
arr 4000
beta
someArr
deep copy
?
?
75 ?
?
2000DynArray
. . .
Private:
size 5
arr 2000
Making a (Separate) Deep Copy
![Page 11: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/11.jpg)
11
Initialization of Class Objects
C++ defines initialization to mean
initialization in a variable declaration
passing an object argument by value
returning an object as the return value of a function
By default, C++ uses shallow copies for these initializations
![Page 12: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/12.jpg)
12
As a result . . .
When a class has a data member that points to dynamically allocated data, you must write what is called a copy constructor
The copy constructor is implicitly called in initialization situations and makes a deep copy of the dynamic data in a different memory location
![Page 13: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/13.jpg)
13
More about Copy Constructors
When you provide (write) a copy constructor for a class, the copy constructor is used to make copies for pass by value
You do not explicitly call the copy constructor
Like other constructors, it has no return type
Because the copy constructor properly defines pass by value for your class, it must use pass by reference in its definition
![Page 14: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/14.jpg)
14
Copy Constructor
Copy constructor is a special member function of a class that is implicitly called in these 3 situations:
Passing object parameters by value
Initializing an object variable in its declaration
Returning an object as the return value of a function
![Page 15: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/15.jpg)
15
?
?
75 ? ?
Private:
size 5
arr 2000
2000 Private:
size 5
arr 4000
4000
?
?
75 ? ?
beta someArr
SomeFunc(beta); // copy-constructor // beta passed by value
deep copy
DynArray
Store
ValueAt
DynArray
~DynArray
CopyFrom
DynArray
Store
ValueAt
DynArray
~DynArray
CopyFrom
![Page 16: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/16.jpg)
16
CONSTRUCTOR
COPY CONSTRUCTOR
DESTRUCTOR
Classes with Data Member Pointers Need
![Page 17: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/17.jpg)
17
DynArray::DynArray(const DynArray& otherArr)// Copy constructor // Implicitly called for deep copy in initializations// POST: If room on free store THEN// new array of size otherArr.size is created// on free store && arr == its base address // && size == otherArr.size
// && arr[0..size-1] == otherArr.arr[0..size-1]// ELSE error occurs
{ int i; size = otherArr.size; arr = new int[size]; // Allocate memory for copy
for (i = 0; i< size; i++) arr[i] = otherArr.arr[i]; // Copies array
}
17
![Page 18: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/18.jpg)
18
What about the assignment operator?
The default method used for assignment of class objects makes a shallow copy
If your class has a data member that points to dynamic data, you should write a member function to create a deep copy of the dynamic data
![Page 19: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/19.jpg)
19
gamma.CopyFrom(beta);
?
?
75 ? ?
Private:
size 5
arr 3000
3000 Private:
size 5
arr 2000
2000
?
?
75 ? ?
gamma beta
deep copy
DynArray
Store
ValueAt
DynArray
~DynArray
CopyFrom
DynArray
Store
ValueAt
DynArray
~DynArray
CopyFrom
![Page 20: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/20.jpg)
20
void DynArray::CopyFrom (/* in */ DynArray otherArr)
// Creates a deep copy of otherArr
// POST: Array pointed to by arr@entry deallocated
// && IF room on free store
// THEN new array is created on free store
// && arr == its base address
// && size == otherArr.size
// && arr[0..size-1] == otherArr[0..size-] // ELSE halts with error message
{
int i;
delete[ ] arr; // Delete current array
size = otherArr.size;
arr = new int [size]; // Allocate new array
for (i = 0; i< size; i++) // Deep copy array
arr[i] = otherArr.arr[i];
}20
![Page 21: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/21.jpg)
21
Appointment Calendar Day
Insert art on page 824
![Page 22: Chapter 15-3 Pointers, Dynamic Data, and Reference Types](https://reader034.fdocuments.in/reader034/viewer/2022042616/5681339f550346895d9ab2f6/html5/thumbnails/22.jpg)
22
The End of Chapter 15 Part 3