![Page 1: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/1.jpg)
TDDE18 & 726G77Classes & Pointers
![Page 2: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/2.jpg)
Premise – lab 3
• Start working with Object Oriented Programming (OOP)• Create the class Sorted_List• Learn the difference between stack and heap• Use dynamic memory with new and delete
![Page 3: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/3.jpg)
Imperative programming
• Programming paradigm that uses statement that change a program’s state. • Focus on how a program operates.• Revolves around function that operates on data
int length_of_string(string s);string to_string(Time const& t);
![Page 4: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/4.jpg)
Object Oriented Programming
• Programming paradigm based on the concept of “objects”• Objects may contain data and code• Data members• Member functions
• Revolves around the data
str.length();cin.ignore(5, ’\n’);
![Page 5: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/5.jpg)
OOP – Real life definition
• If I’m your coffee getter object• “Can you get me the best coffee, please.” is a question that you asked• ”Here is your coffee” as a result from me.
• You have no idea how I did that. • we were able to interact at a very high level of abstraction.
![Page 6: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/6.jpg)
Variable
• Fundamental (also called built-in types)• Stores a value of a fundamental type, nothing more
• Object• Stores values tied to an derived type (struct, class)• Operations associated to the type are provided
• Pointer• Stores the address of some other variable
![Page 7: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/7.jpg)
Class
• Data members – store valuesstring str{“Hello World!”};
• Member functions – operations available to usestr.size();
str
Hello World!String
instructions:
size() – amount char
![Page 8: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/8.jpg)
Class – the blueprint of an object
• Data members – store valuesPerson p{“Sam”, “Le”, 32};
• Member functions – operations available to usep.first_name();
str
Sam
Person
instructions:
first_name()
- return firstname
Le32
![Page 9: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/9.jpg)
Class syntax – header file
#ifndef _CLASS-NAME_H_#define _CLASS-NAME_H_class class-name {public:
class-name(); // constructor (Initiator)// member functions (methods in Java)return-type operation(parameter-list);
private:// member variablesdata-type property;
};#endif
![Page 10: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/10.jpg)
Class syntax – implementation file
#include “class-name.h”
// Constructor (Initiator)class-name::class-name() {
// implementation}
// Member functionreturn-typeclass-name::operation(parameter-list) {
// implementation}
![Page 11: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/11.jpg)
Class
• Provide language support for object orientation• Having a single purpose, responsibility• Consist of private member variables and public interface methods• Can only be manipulated through a well defined interface• Constructors and interface enables the programmer to depend on
always known and correct internal state• Operators, constructors and destructors allow for easy management
![Page 12: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/12.jpg)
Class vs Instance
• A class only describe the layout. It does not create any data in memory. It’s a description of a data-type with operations ”embedded”.
class Rocket {public:
void fly();bool finished;
private:int height;
};
![Page 13: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/13.jpg)
Class vs Instance
• An instance is a variable created of a specific class, an object. You can create many.
Rocket r{};Rocket s{}
![Page 14: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/14.jpg)
Class declaration
// h-fileclass Robot {public:
void fly();bool finished;
private:int height;
};
// cc-filevoid Robot::fly() {
cout << “I’m flying” << endl;}
![Page 15: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/15.jpg)
Accessing members
• An object variable allow you to access member functions (operations) and member variables of that instance. You use the dot operator
// Access member functionsRocket r{};r.finished = true;r.fly();
// Class definitionclass Rocket {public:
void fly();bool finished;
private:int height;
};
![Page 16: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/16.jpg)
Accessing members
• Accessing a member inside a class does not require you to tell the compiler which instance you are referring to.
// Outside of classint main() {
Rocket r{};r.finished = true;
}
// Inside the classclass Rocket {public:
void fly() {finished = true;
};
![Page 17: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/17.jpg)
The keyword “this”
• Member functions are called “on” an instance and automatically receive that instance to work on, available as the special pointer this.
void Robot::fly() {finished = true;cout << ”I’m finished and I can fly” << endl;
}
void Robot::fly() {this -> finished = true;cout << ”I’m finished and I can fly” << endl;
}
![Page 18: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/18.jpg)
Private members
• Private members are only accessible in functions belonging to the same class
int main() {Rocket r{};r.model = “M-3”; //Error
}
class Rocket {public:
void fly() {model = “M-3”; //OK
}};
![Page 19: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/19.jpg)
Friends
• A class can decide to have friends. Friends can access private members!• Friends should be avoided at all cost, since it makes the two classes highly
interdependent.class Rocket {
...friend bool equals(Rocket r1, Rocket r2);...
};bool equals(Rocket r1, Rocket r2) {
return r1.model == r2.model;}
![Page 20: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/20.jpg)
Object lifecycle
• class definition:• no object created yet, before birth
• variable definition:• object born, memory allocated• memory initiated with default values
• variable used...• variable declaration block ends:• memory reclaimed for other variables
![Page 21: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/21.jpg)
Object lifecycle
• class definition:• no object created yet, before birth
• variable definition:• object born, memory allocated• memory initiated with default values
• variable used...• variable declaration block ends:• memory reclaimed for other variables
Constructor
Destructor
Member functionsOperator functions
![Page 22: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/22.jpg)
Lifecycle “hooks”
• Constructor is automatically called when a class variable is defined or allocated• have no return value• any defined parameters must be specified
• Operators functions are automatically called when variable is used by an operator• covered later on
• Destructor is automatically called when a variable goes out of scope or is deleted• have neither return value nor parameters
![Page 23: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/23.jpg)
The rocket constructor
// h-fileclass Rocket {public:
Rocket(); // Constructorprivate:
string model;};
// cc-fileRocket::Rocket() {
model = “Unknown”;}
![Page 24: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/24.jpg)
Using the constructor
• If you define a constructor you must specify all arguments when you create an instance!• If you do not define a constructor a default constructor that does
nothing will be created.• If you only have private constructors other code can not create
instances.
![Page 25: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/25.jpg)
Default constructor// h-fileclass Rocket {public:
Rocket(); // Default Constructor...
};// cc-fileRocket::Rocket() {}
• If you do not define a constructor the compiler will generate a similar default constructor for you.
![Page 26: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/26.jpg)
Constructor Example
// h-fileclass Rocket {public:
Rocket(string m);...
};// cc-fileRocket::Rocket(string m) {
model = m;}
![Page 27: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/27.jpg)
Constructor Example
// h-fileclass Rocket {public:
Rocket(string m);...
};// cc-fileRocket::Rocket(string m) {
model = m;}
// OkRocket r{“M-3”};
// Error no fitting constructorRocket s{};
![Page 28: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/28.jpg)
Constructor Performance Issue
Rocket::Rocket(string m) {model = m;
}
1. Create model variable inside rocket2. Update model variable with correct value
model
<no value>string
model
<m’s value>string
![Page 29: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/29.jpg)
Constructor Member Initializer List
Robot::Robot(string m) : model{m} {}
Member initializer list specifies the initializers for data members.
model
<m’s value>string
![Page 30: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/30.jpg)
Const member variables
• Data members could also be const• Constant member variable must be initialized in constructor
initialization list
class Robot {public:
...string const model;
};
Robot::Robot(string m) model{m} {}
![Page 31: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/31.jpg)
Reference member variables
• Data members could also be a reference to another variable• Reference member variables must be initialized in constructor
initialization list
class Robot {...private:
Person & creator;};
![Page 32: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/32.jpg)
Constructor – Multiple
• Constructor can be overloaded in a similar way as function overloading• Overloaded constructor have the same name (name of the class) but different
number of arguments• The compiler choose the constructor that fits best with the given input
arguments...
Robot();Robot(string m);Robot(Person p);Robot(Person p, string m);etc.
...
![Page 33: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/33.jpg)
Constructor delegation
• Many classes have multiple constructors that do similar things• You could reduce the repetitive code by delegating the work to
another constructor
Robot::Robot() : Robot{“unknown”} {}Robot::Robot(string m) : model{m} {}
![Page 34: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/34.jpg)
Destructor
• The object calls the destructor when it is about to go out of scope
int main() {Robot r{};
} // r will call its destructor on this line
![Page 35: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/35.jpg)
Destructor
// h-fileclass Robot {public:
~Robot(); // no return or parameters...
};
// cc-fileRobot::~Robot() { // not useful yet...
cout << “destructor called” << endl;}
![Page 36: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/36.jpg)
Example class - Money
• Class that represent money• Have the capacity to hold units (Swedish krona)• Have the capacity to hold hundreds (Swedish öre)• Can validate that it have valid (non-negative values) in units and
hundreds.
![Page 37: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/37.jpg)
Example class
class Money {public:
Money();Money(int unit);Money(int unit, int hundred);~Money();void validate();
private:int unit;int hundred;
};
Money::Money() : Money{0} {}
Money::Money(int unit) : Money {unit, 0} {}
Money::Money(int unit, int hundred) : unit{unit}, hundred{hundred} {validate();
}void Money::validate() {if (unit < 0 || hundred < 0)
...
![Page 38: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/38.jpg)
Pointer
Name
Value
Type
Name
Value
Type
![Page 39: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/39.jpg)
Pointer
• A variable that stores an address• Compiler (programmer) keep track of what type each pointer address
store in order to index and treat dereference values correct.• Read declaration backwardsint * p; // A variable p
// That is a pointer// To an int
![Page 40: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/40.jpg)
Pointer operators
• Operators relevant to pointers• Dereference (content of, “go to”): *p• Dereference with offset (indexing): *(p + i) or p[i]• Address of: &• Dereference and select member: (*p).m or p->m• Allocate (borrow) memory: p = new t, a = new t[s]• Deallocate (return) memory: delete p, delete[] a
![Page 41: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/41.jpg)
Pointer – Address of
Name
Value
Type
Name
Value
Type
int * int_pointer{&integer_value}; int integer_value{};
![Page 42: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/42.jpg)
Pointer – Dereference
Name
Value
Type
Name
Value
Type
cout << *int_pointer << endl;
![Page 43: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/43.jpg)
Pointer – Allocate
Name
Value
Type
new int{3};
1. Create unknown variable of type int with value 32. Return the pointer
Save the pointer by declaring a new variableint * integer_pointer{new int{3}};
![Page 44: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/44.jpg)
Pointer – Deallocate
Name
Value
1. Delete the variable that the pointer points to2. Does not remove the pointer!
delete integer_pointer;
![Page 45: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/45.jpg)
Pointer – Dereference and select member
string_pointer
address of other boxstring * hello world
string
string * string_pointer{new string{“hello world”}};string_pointer->length();
![Page 46: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/46.jpg)
Dynamic memory
• Memory for variables can be dynamically allocated and deallocated• Dynamic: During program execution• Normal/Static: During compile time• Allocate: Borrow from operating system• Deallocate: return to operating system
• Each allocation must be deallocated exactly once, as soon as possible
![Page 47: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/47.jpg)
What if ...
• We assign (copy) pointer variables? int * a_ptr { new int { 4 } };int * b_ptr { a_ptr };
• We pass pointer variables as parameter?void foo(int * p);
![Page 48: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/48.jpg)
Shallow copy vs deep copyShallow copy
Data
Deep copy
Data
Data
Pointer a
Pointer b
Pointer a
Pointer b
![Page 49: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/49.jpg)
Shallow copy vs deep copyShallow copy
Data
Deep copy
Data
Data
Pointer a
Pointer b
Pointer a
Pointer b
Example code:int * a{new Integer{3}};int * b{a};
Example code:int * a{new Integer{3}};int * b{new Integer{*a}};
![Page 50: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/50.jpg)
Class with pointer
class Array {public:
Array(int size);...
private:int size_;int * data;
};
![Page 51: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/51.jpg)
What if ...
• We pass Array variables as parameter?• We assign (copy) Array variables?• We want to initialize an array from another?• Destroy an Array variable?• Move an Array variable about to be destroyed to another array?
![Page 52: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/52.jpg)
Lifecycle “hooks”
• Constructor is automatically called when a class variable is defined or allocated• have no return value• any defined parameters must be specified
• Operators functions are automatically called when variable is used by an operator• Set an object equals to another object
• Destructor is automatically called when a variable goes out of scope or is deleted• have neither return value nor parameters
![Page 53: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/53.jpg)
Lifecycle “hooks”
• Constructor is automatically called when a class variable is defined or allocated• have no return value• any defined parameters must be specified
• Operators functions are automatically called when variable is used by an operator• Set an object equals to another object
• Destructor is automatically called when a variable goes out of scope or is deleted• have neither return value nor parameters
Eg. Assignment operator
Eg. Default constructor
Destructor
![Page 54: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/54.jpg)
Three essential “hooks”
• Copy constructor• Called automatically when a fresh object is created as a copy of an existing
objectArray(Array const&);
• Assignment operator• Called automatically when an existing object is overwritten by another object
(or itself)Array & operator=(Array const&);
• Destructor• Called automatically when an object is destroyed~Array();
![Page 55: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/55.jpg)
When?
• If you have a class with pointers you need the three essential hooks to prevent memory leaks• The compiler generate default versions if they do not exist, but the
compiler version WILL NOT be adequate or enough• If your class have no pointers, you do not have to care, the compiler
version will be enough
![Page 56: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/56.jpg)
Array class
class Array {public:
Array(int size);...
private:int size_;int * data;
};
![Page 57: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/57.jpg)
Object A
Shallow copy vs deep copyShallow copy
Data
Deep copy
Data
Data
Object a
Object b
Object a
Object b
The heap The heap
![Page 58: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/58.jpg)
Object A
Shallow copy vs deep copyShallow copy
Data
Deep copy
Data
Data
Object a
Object b
Object a
Object b
The heap The heap
Example code:Array a{};Array b{a};
![Page 59: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/59.jpg)
Object A
Shallow copy vs deep copyShallow copy
Data
Deep copy
Data
Data
Object a
Object b
Object a
Object b
The heap The heap
Example code:Array a{};Array b{a};
Compiler generated Correct implemented copy constructor
![Page 60: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/60.jpg)
Copy constructor – syntax
class Array {...Array(Array const& a);...
};
// cc-fileArray::Array(Array const& other) {
// allocate new memory// etc
}
![Page 61: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/61.jpg)
Temporary variable
Array foo() {return Array{};
}
int main() {Array a{foo()};
}
![Page 62: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/62.jpg)
Temporary variable
Array foo() {return Array{};
}
int main() {Array a{foo()};
}
Data
The heap
foo()’s array
![Page 63: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/63.jpg)
Temporary variable
Array foo() {return Array{};
}
int main() {Array a{foo()};
}
Data
Data
The heap
foo()’s array
a’s array
![Page 64: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/64.jpg)
Temporary variable
Array foo() {return Array{};
}
int main() {Array a{foo()};
}
Data
The heap
a’s array
![Page 65: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/65.jpg)
Temporary variable
Array foo() {return Array{};
}
int main() {Array a{foo()};
}
Data
The heap
foo()’s array
a’s array
![Page 66: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/66.jpg)
Move constructor – syntax
class Array {...Array(Array && a);...
};
// cc-fileArray::Array(Array && other) {
// swap the pointers// etc
}
![Page 67: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/67.jpg)
Problems that might occur with copy assignment
int main() {Array a{};Array b{};b = a;
}
Data - a
The heap
Array a
![Page 68: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/68.jpg)
Problems that might occur with copy assignment
int main() {Array a{};Array b{};b = a;
}
Data - a
The heap
Data - b
Array a
Array b
![Page 69: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/69.jpg)
Problems that might occur with copy assignment
int main() {Array a{};Array b{};b = a;
}
Data - a
The heap
Data - b
Data – copy of a
Array a
Array b
Still in memory – Memory leakYou must remove this manually in your - copy assignment- move assignment
![Page 70: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/70.jpg)
Copy assignment - syntax
// h-fileclass Array {
...Array & operator=(Array const& other);...
};
// cc-fileArray & Array::operator=(Array const& other) {
// implementation};
![Page 71: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/71.jpg)
Move assignment - syntax
// h-fileclass Array {
...Array & operator=(Array && other);...
};
// cc-fileArray & Array::operator=(Array && other) {
// implementation};
![Page 72: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/72.jpg)
Object that is going to be removed
int main() {Array a{};
} // a will be removed hereData
The heap
Array a
![Page 73: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/73.jpg)
Object that is going to be removed
int main() {Array a{};
} // a will be removed hereData
The heap
Compiler generated destructorData still on the heap
![Page 74: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/74.jpg)
Destructor – syntax
// h-fileclass Array {
...~Array();...
}// cc-fileArray::~Array() {
// deallocate memory}
The heap
Array a
Deallocated memory before removing object
![Page 75: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/75.jpg)
Constructors
• Constructor – Called when creating a new object• Copy constructor – Called when creating a new object from an old
object• Move constructor – Called when creating a new object from an object
that is about to be removed• Copy assignment – Assign an existing object the same values as
another object• Move assignment – Assign an existing object the same values as an
object that is about to be removed• Destructor – Called when an existing object is about to be removed
![Page 76: TDDE18 & 726G77€¦ · OOP –Real life definition ... // Constructor (Initiator) class-name::class-name() {// implementation} // Member function ... •Operators, constructors and](https://reader035.vdocuments.site/reader035/viewer/2022062605/5fd429a7d9a6f77ac205c9ee/html5/thumbnails/76.jpg)
Random number generator
#include <random>random_device rand{};uniform_int_distribution<int> die(1, 6);int n = die(rand); // random in [1 .. 6]
Further reference:en.cppreference.com