Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-1 Concordia University Department of...
-
Upload
rogelio-stillman -
Category
Documents
-
view
215 -
download
0
Transcript of Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-1 Concordia University Department of...
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-1
Concordia University
Department of Computer Science and Software Engineering
COMP345
Advanced program design with C++
Slide set 3: static and dynamic arrays
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-2
Learning Objectives
Introduction to Arrays Declaring and referencing arrays For-loops and arrays Arrays in memory
Arrays in Functions Arrays as function arguments, return values
Programming with Arrays Partially Filled Arrays, searching, sorting
Multidimensional Arrays
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-3
Introduction to Arrays
Array definition: A collection of data of same type
First "aggregate" data type Means "grouping" int, float, double, char are simple data types
Used for lists of like items Test scores, temperatures, names, etc. Avoids declaring multiple simple variables Can be manipulated as a single entity, with some restrictions
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-4
Declaring Arrays
Declare the array : allocates memoryint score[5];
Declares array of 5 integers named "score" Similar to declaring five variables:
int score[0], score[1], score[2], score[3], score[4]
Individual parts called many things: Indexed or subscripted variables “Elements” of the array Value in brackets called index or subscript
Numbered from [0] to [size – 1]
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-5
Accessing Arrays
Access using index/subscriptcout << score[3];
Note two uses of brackets: In declaration, specifies SIZE of array Anywhere else, specifies a SUBSCRIPT
Size and subscript need not be literalint score[MAX_SCORES];score[n+1] = 99;
If n is 2, identical to: score[3] However, the SIZE needs to be a CONSTANT Subscript can be any expression eventually evaluating to an
integer value (constant or not)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-6
Array Usage
Powerful storage mechanism
Can issue command like: "Do this to ith indexed variable"
where i is computed by program "Display all elements of array score" "Fill elements of array score from user input" "Find highest value in array score" "Find lowest value in array score"
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-7
Program Using an Array (1 of 2)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-8
Program Using an Array (2 of 2)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-9
for-loops with Arrays
Natural counting loop Naturally works well "counting thru" elements
of an array
Example:
for (idx = 0; idx<5; idx++){
cout << score[idx] << "off by "<< max – score[idx] << endl;
}
Loop control variable (idx) counts from 0 to 5
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-10
Major Array Pitfall
Array indexes always start with zero! Zero is "first" number to computer
scientists C++ will "let" you go beyond range
Unpredictable results Compiler will not detect these errors!
Up to programmer to "stay in range"
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-11
Major Array Pitfall Example
Indexes range from 0 to (array_size – 1) Example:
double temperature[24]; // 24 is array size// Declares array of 24 double values // called temperature
They are indexed as:temperature[0], temperature[1] … temperature[23]
Common mistake:temperature[24] = 5;
Index 24 is "out of range"! No warning, possibly disastrous results
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-12
Defined Constant as Array Size
Always use defined/named constant forarray size
Example:const int NUMBER_OF_STUDENTS = 5;int score[NUMBER_OF_STUDENTS];
Improves readability
Improves versatility
Improves maintainability
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-13
Uses of Defined Constant
Use everywhere size of array is needed In for-loop for traversal:
for (idx = 0; idx < NUMBER_OF_STUDENTS; idx++){ // Manipulate array}
In calculations involving size:lastIndex = (NUMBER_OF_STUDENTS – 1);
When passing array to functions (later)
If size changes requires only ONE change in program (and recompilation)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-14
Arrays in Memory
Recall simple variables: Allocated memory in an "address"
Array declarations allocate memory forentire array
Sequentially-allocated Means addresses allocated "back-to-back" Allows indexing calculations
Simple "addition" from array beginning (index 0)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-15
An Array in Memory
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-16
Initializing Arrays
As simple variables can be initialized atdeclaration:int price = 0; // 0 is initial value
Arrays can as well:int children[3] = {2, 12, 1}; Equivalent to following:int children[3];children[0] = 2;children[1] = 12;children[2] = 1;
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-17
Auto-Initializing Arrays
If fewer values than size supplied: Fills from beginning Fills "rest" with zero of array base type
If array-size is left out Declares array with size required based on
number of initialization values Example:int b[] = {5, 12, 11};
Allocates array b to size 3
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-18
Arrays in Functions
As arguments to functions Indexed variables
An individual "element" of an array can be function parameter
Entire arrays All array elements can be passed as
"one entity“
As return value from function Can be done
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-19
Indexed Variables as Arguments
Indexed variable handled same as simplevariable of array base type
Given this function declaration:void myFunction(double par1);
And these declarations:int i; double n, a[10];
Can make these function calls:myFunction(i);// i is converted to doublemyFunction(a[3]);// a[3] is doublemyFunction(n);// n is double
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-20
Subtlety of Indexing
Consider: myFunction(a[i]);
Value of i is determined first It determines which indexed variable is sent
myFunction(a[i*5]); Perfectly legal, from compiler’s view Programmer responsible for staying
"in-bounds" of array
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-21
Entire Arrays as Arguments
Formal parameter can be entire array Argument then passed in function call
is array name Called "array parameter“
Send size of array as well Typically done as second parameter Simple int type formal parameter
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-22
Entire Array as Argument Example
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-23
Entire Array as Argument Example
Given previous example: In some main() function definition,
consider this call:int score[5], numberOfScores = 5;fillup(score, numberOfScores); 1st argument is entire array 2nd argument is integer value
Note no brackets in array argument!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-24
Array as Argument: How?
What’s really passed?
Think of array as 3 "pieces" Address of first indexed variable (arrName[0]) Array base type Size of array
Only 1st piece is passed! Just the beginning address of array Very similar to "pass-by-reference"
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-25
Array Parameters
May seem strange No brackets in array argument Must send size separately
One nice property: Can use SAME function to fill any size array! Exemplifies "re-use" properties of functions Example:int score[5], time[10];fillUp(score, 5);fillUp(time, 10);
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-26
The const Parameter Modifier
Recall: array parameter actually passesaddress of 1st element Similar to pass-by-reference
Function can then modify array! Often desirable, sometimes not!
Protect array contents from modification Use "const" modifier before array parameter
Called "constant array parameter" Tells compiler to "not allow" modifications
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-27
Functions that Return an Array
Functions cannot return arrays in the same way simple types are returned
Requires use of a pointer
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-28
Programming with Arrays
Plenty of uses
Partially-filled arrays Must be declared some "max size"
Sorting
Searching
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-29
Partially-filled Arrays
Difficult to know exact array size needed
Must declare to be largest possible size Must then keep "track" of valid data in array
Additional "tracking" variable needed int numberUsed; Tracks current number of elements in array
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-30
Partially-filled Arrays Example: Partially Filled Array (1 of 5)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-31
Partially-filled Arrays Example: Partially Filled Array (2 of 5)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-32
Partially-filled Arrays Example: Partially Filled Array (3 of 5)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-33
Partially-filled Arrays Example: Partially Filled Array (4 of 5)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-34
Partially-filled Arrays Example: Partially Filled Array (5 of 5)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-35
Global Constants vs. Parameters
Constants typically made "global" Declared above main()
Functions then have scope to arraysize constant No need to send as parameter then?
Technically yes
Why should we anyway? Function definition might be in separate file Function might be used by other programs!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-36
Searching an Array (1 of 4)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-37
Searching an Array (2 of 4)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-38
Searching an Array (3 of 4)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-39
Searching an Array (4 of 4)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-40
Sorting an Array: Selection Sort
Selection Sort Algorithm
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-41
Sorting an Array (1 of 4)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-42
Sorting an Array (2 of 4)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-43
Sorting an Array (3 of 4)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-44
Sorting an Array (4 of 4)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-45
Multidimensional Arrays
Arrays with more than one index char page[30][100];
Two indexes: An "array of arrays" Visualize as:page[0][0], page[0][1], …, page[0][99]page[1][0], page[1][1], …, page[1][99]…page[29][0], page[29][1], …, page[29][99]
C++ allows any number of indexes Typically no more than two
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-46
Multidimensional Array Parameters
Similar to one-dimensional array 1st dimension size not given
Provided as second parameter
2nd dimension size IS given
Example:
void displayPage(const char p[][100], int sizeDimension1){
for (int index1=0; index1<sizeDimension1; index1++){
for (int index2=0; index2 < 100; index2++)cout << p[index1][index2];
cout << endl;}
}
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-47
Summary 1
Array is collection of "same type" data
Indexed variables of array used just likeany other simple variables
for-loop "natural" way to traverse arrays
Programmer responsible for staying"in bounds" of array
Array parameter is "new" kind Similar to call-by-reference
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-48
Summary 2
Array elements stored sequentially "Contiguous" portion of memory Only address of 1st element is passed to functions
Partially-filled arrays more tracking
Constant array parameters Prevent modification of array contents
Multidimensional arrays Create "array of arrays"
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-49
Dynamic arrays and pointers
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-50
Learning Objectives
Pointers Pointer variables Memory management
Dynamic Arrays Creating and using Pointer arithmetic
Classes, Pointers, Dynamic Arrays The this pointer Destructors, copy constructors
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-51
Pointer Introduction
Pointer definition: Memory address of a variable
Recall: memory divided Numbered memory locations Addresses used as name for variable
You’ve used pointers already! Call-by-reference parameters
Address of actual argument was passed
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-52
Pointer Variables
Pointers are "typed" Can store pointer in variable Not int, double, etc.
Instead: A POINTER to int, double, etc.!
Example:double *p; p is declared a "pointer to double" variable Can hold pointers to variables of type double
Not other types!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-53
Declaring Pointer Variables
Pointers declared like other types Add "*" before variable name Produces "pointer to" that type
"*" must be before each variable declaration
int *p1, *p2, v1, v2; p1, p2 hold pointers to int variables v1, v2 are ordinary int variables
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-54
Addresses and Numbers
Pointer is an address
Address is an integer
Pointer is NOT an integer!
C++ forces pointers be used asaddresses Cannot be used as numbers Even though it "is a" number
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-55
Pointing
Terminology, view Talk of "pointing", not "addresses" Pointer variable "points to" ordinary variable Leave "address" talk out
Makes visualization clearer "See" memory references
Arrows
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-56
Pointing to …
int *p1, *p2, v1, v2;p1 = &v1; Sets pointer variable p1 to "point to" int
variable v1
Operator, & Determines "address of" variable
Read like: "p1 equals address of v1" Or "p1 points to v1"
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-57
Pointing to …
Recall:int *p1, *p2, v1, v2;p1 = &v1;
Two ways to refer to v1 now: Variable v1 itself:cout << v1;
Via pointer p1:cout << *p1;
Dereference operator, * Pointer variable "derereferenced" Means: "Get data that p1 points to"
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-58
"Pointing to" Example
Consider:v1 = 0;p1 = &v1;*p1 = 42;cout << v1 << endl;cout << *p1 << endl;
Produces output:4242
p1 and v1 refer to same memory cell
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-59
& Operator
The "address of" operator
Also used to specify call-by-referenceparameter No coincidence! Recall: call-by-reference parameters pass
"address of" the actual argument
Operator’s two uses are closely related
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-60
Pointer Assignments
Pointer variables can be "assigned":int *p1, *p2;p2 = p1; Assigns one pointer to another "Make p2 point to where p1 points“
Do not confuse with:*p2 = *p1; Assigns "value pointed to" by p1, to "value
pointed to" by p2
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-61
Pointer Assignments Graphic: Uses of the Assignment Operator with Pointer Variables
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-62
The new Operator
Since pointers can refer to variables… No "real" need to have a standard identifier
Can dynamically allocate variables Operator new creates variables
No identifiers to refer to them Just a pointer!
p1 = new int; Creates new "nameless" variable, and
assigns p1 to "point to" it Can access its value with *p1
Use just like ordinary variable
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-63
Basic Pointer Manipulations (1 of 2)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-64
Basic Pointer Manipulations (2 of 2)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-65
Basic Pointer Manipulations Graphic:
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-66
More on new Operator
Creates new dynamic variable Allocated on the heap.
Returns pointer to the new variable
If type is class type: Constructor is called for new object Can invoke different constructor with
initializer arguments:MyClass *mcPtr;mcPtr = new MyClass(32.0, 17);
Can still initialize non-class types:int *n;n = new int(17); //Initializes *n to 17
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-67
Pointers and Functions
Pointers are full-fledged types Can be used just like other types
Can be function parameters
Can be returned from functions
Example:int* findOtherPointer(int* p); This function declaration:
Has "pointer to an int" parameter Returns "pointer to an int" variable
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-68
Memory Management
Heap Also called "freestore" Reserved for dynamically-allocated variables All new dynamic variables consume memory
from the freestore If too many could use all freestore memory
Future new operations will fail if freestoreis "full"
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-69
Checking new Success
Older compilers: Test if null returned by call to new:
int *p;p = new int;if (p == NULL){ cout << "Error: Insufficient memory.\n"; exit(1);}
If new succeeded, program continues
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-70
new Success – New Compiler
Newer compilers: If new operation fails:
Program terminates automatically Produces error message
Still good practice to use NULL check
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-71
Freestore Size
Varies with implementations
Typically large Most programs won’t use all memory
Memory management Still good practice Solid software engineering principle Memory IS finite
Regardless of how much there is!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-72
delete Operator
De-allocate dynamic memory When no longer needed Returns memory to freestore Example:
int *p;p = new int(5);… //Some processing…delete p;
De-allocates dynamic memory "pointed to bypointer p"
Literally "destroys" memory content
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-73
Dangling Pointers
delete p; Destroys dynamic memory But p still points there!
Called "dangling pointer"
If p is then dereferenced ( *p ) Unpredicatable results! Often disastrous!
Avoid dangling pointers Assign pointer to NULL after delete:
delete p;p = NULL;
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-74
Dynamic and Automatic Variables
Dynamic variables Created with new operator Created and destroyed while program runs
Local variables Declared within function definition Not dynamic
Created when function is called Destroyed when function call completes
Often called "automatic" variables Properties controlled for you
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-75
Define Pointer Types
Can "name" pointer types To be able to declare pointers like other
variables Eliminate need for "*" in pointer declaration
typedef int* IntPtr; Defines a "new type" alias Consider these declarations:
IntPtr p;int *p;
The two are equivalent
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-76
Pitfall: Call-by-value Pointers
Behavior subtle and troublesome If function changes pointer parameter
itself only change is to local copy
Best illustrated with example…
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-77
A Call-by-Value Pointer Parameter (1 of 2)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-78
A Call-by-Value Pointer Parameter (2 of 2)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-79
Call-by-value Pointers Graphic: The Function Call sneaky(p);
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-80
Dynamic Arrays
Array variables Really pointer variables!
Standard array Fixed size
Dynamic array Size not specified at programming time Determined while program running
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-81
Array Variables
Recall: arrays stored in memoryaddresses, sequentially Array variable "refers to" first indexed variable So array variable is a kind of pointer variable!
Example:
int a[10];int * p;
a and p are both pointer variables!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-82
Array Variables Pointers
Recall previous example:
int a[10];typedef int* IntPtr;IntPtr p;
a and p are pointer variables Can perform assignments:p = a; // Legal.
p now points where a points To first indexed variable of array a
a = p; // ILLEGAL! Array pointer is CONSTANT pointer!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-83
Array Variables Pointers
Array variable
int a[10]; MORE than a pointer variable
const int * type Array was allocated in memory already Variable a MUST point there…always!
Cannot be changed!
In contrast to ordinary pointers Which can (and typically do) change
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-84
Dynamic Arrays
Array limitations Must specify size first May not know until program runs!
Must "estimate" maximum size needed Sometimes OK, sometimes not "Wastes" memory
Dynamic arrays Can grow and shrink as needed
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-85
Creating Dynamic Arrays
Very simple!
Use new operator Dynamically allocate with pointer variable Treat like standard arrays
Example:
typedef double * DoublePtr;DoublePtr d;d = new double[10]; //Size in brackets
Creates dynamically allocated array variable d,with ten elements, base type double
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-86
Deleting Dynamic Arrays
Allocated dynamically at run-time So should be destroyed at run-time
Simple again. Recall Example:
d = new double[10];… //Processingdelete [] d;
De-allocates all memory for dynamic array Brackets indicate "array" is there Recall: d still points there!
Should set d = NULL;
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-87
Function that Returns an Array
Array type NOT allowed as return-type of function
Example:int [] someFunction(); // ILLEGAL!
Instead return pointer to array base type:int* someFunction(); // LEGAL!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-88
Pointer Arithmetic
Can perform arithmetic on pointers "Address" arithmetic
Example:
typedef double* DoublePtr;DoublePtr d;d = new double[10];
d contains address of d[0] d + 1 evaluates to address of d[1] d + 2 evaluates to address of d[2]
Equates to "address" at these locations
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-89
Alternative Array Manipulation
Use pointer arithmetic!
"Step thru" array without indexing:for (int i = 0; i < arraySize; i++)
cout << *(d + I) << " " ;
Equivalent to:for (int i = 0; i < arraySize; i++)
cout << d[I] << " " ;
Only addition/subtraction on pointers No multiplication, division
Can use ++ and -- on pointers
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-90
Multidimensional Dynamic Arrays
Yes we can! Recall: "arrays of arrays" Type definitions help "see it":
typedef int* IntArrayPtr;IntArrayPtr *m = new IntArrayPtr[3];
Creates array of three pointers Make each allocate array of 4 ints
for (int i = 0; i < 3; i++)m[i] = new int[4];
Results in three-by-four dynamic array!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-91
Back to Classes The -> operator
Shorthand notation
Combines dereference operator, *, anddot operator
Specifies member of class "pointed to"by given pointer
Example:
MyClass *p;p = new MyClass;p->grade = "A"; //Equivalent to:(*p).grade = "A";
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-92
The this Pointer Member function definitions might need to refer to
calling object Use predefined this pointer
Automatically points to calling object:
class Simple{ public:
void showStuff() const; private:
int stuff;};
Two ways for member functions to access:cout << stuff;cout << this->stuff;
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-93
Overloading Assignment Operator
Assignment operator returns reference So assignment "chains" are possible e.g., a = b = c;
Sets a and b equal to c
Operator must return "same type" as it’sleft-hand side To allow chains to work The this pointer will help with this!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-94
Overloading Assignment Operator
Recall: Assignment operator must bemember of the class It has one parameter Left-operand is calling objects1 = s2;
Think of like: s1.=(s2);
s1 = s2 = s3; Requires (s1 = s2) = s3; So (s1 = s2) must return object of s1’s type
And pass to " = s3";
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-95
Overloaded = Operator Definition
Uses string Class example:
StringClass& StringClass::operator=(const StringClass& rtSide)
{ if (this == &rtSide)// if right side same as left side return *this; else { capacity = rtSide.length;
length = rtSide.length;delete [] a; // a is a char array class member
// that stores the stringa = new char[capacity];for (int I = 0; I < length; I++) a[I] = rtSide.a[I];return *this;
}
}
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-96
Shallow and Deep Copies
Shallow copy Assignment copies only member variable
contents over Default assignment and copy constructors
Deep copy Pointers, dynamic memory involved Must dereference pointer variables to
"get to" data for copying Write your own assignment overload and
copy constructor in this case!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-97
Destructor Need
Dynamically-allocated variables Do not go away until "deleted"
If pointers are only private member data They dynamically allocate "real" data
In constructor
Must have means to "deallocate" whenobject is destroyed
Answer: destructor!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-98
Destructors
Opposite of constructor Automatically called when object is out-of-scope Default version only removes ordinary
variables, not dynamic variables
Defined like constructor, just add ~ MyClass::~MyClass(){
//Perform delete clean-up duties}
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-99
Copy Constructors
Automatically called when:1. Class object declared and initialized to other object
2. When function returns class type object
3. When argument of class type is "plugged in"as actual argument to call-by-value parameter
Requires "temporary copy" of object Copy constructor creates it
Default copy constructor Like default "=", performs member-wise copy
Pointers write own copy constructor!
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-100
Summary 1
Pointer is memory address Provides indirect reference to variable
Dynamic variables Created and destroyed while program runs
Freestore Memory storage for dynamic variables
Dynamically allocated arrays Size determined as program runs
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-101
Summary 2
Class destructor Special member function Automatically destroys objects
Copy constructor Single argument member function Called automatically when temp copy needed
Assignment operator Must be overloaded as member function Returns reference for chaining
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-102
Vectors
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-103
Vectors
Vector Introduction
Recall: arrays are fixed size
Vectors: "arrays that grow and shrink" During program execution
Formed from Standard Template Library(STL)
Using template class
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-104
Vector Basics
Similar to array: Has base type Stores collection of base type values
Declared differently: Syntax: vector<Base_Type>
Indicates template class Any type can be "plugged in" to Base_Type Produces "new" class for vectors with that type
Example declaration:vector<int> v;
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-105
Vector Use
vector<int> v; "v is vector of type int" Calls class default constructor
Empty vector object created
Indexed like arrays for access
But to add elements: Must call member function push_back
Member function size() Returns current number of elements
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-106
Vector Example: Using a Vector (1 of 2)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-107
Vector Example: Using a Vector (2 of 2)
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-108
Vector Efficiency
Member function capacity() Returns memory currently allocated Not same as size() Capacity typically > size
Automatically increased as needed
If efficiency critical: Can set behaviors manually
v.reserve(32); //sets capacity to 32
v.reserve(v.size()+10); //sets capacity to 10 more than size
Copyright 2006 Pearson Addison-Wesley, 2008, 2013 Joey Paquet 3-109
Summary 1
Vector classes Like: "arrays that grow and shrink"