TDDE18 & 726G77
Classes & Pointers
Christoffer Holm
Department of Computer and informaon science
TDDE18 & 726G77 Classes & Pointers Christoffer Holm - - PowerPoint PPT Presentation
TDDE18 & 726G77 Classes & Pointers Christoffer Holm Department of Computer and informaon science 1 Classes 2 Pointers 3 List lab 4 Special Member Funcons 2 / 82 Classes What is a class? struct Date { int day; int month;
Department of Computer and informaon science
2 / 82
What is a class?
struct Date { int day; int month; int year; }; bool operator<(Date d1, Date d2) { // ... } Date next_date(Date d) { // ... }
2 / 82
What is a class?
struct Date { int day; int month; int year; }; bool operator<(Date d1, Date d2) { // ... } Date next_date(Date d) { // ... } class Date { public: int day; int month; int year; bool operator<(Date d) { // ... } Date next_date() { // ... } };
3 / 82
What is a class?
4 / 82
How does it work?
Date today {27, 9, 2019}; Date tomorrow {next_date(today)}; if (today < tomorrow) { // ... }
4 / 82
How does it work?
Date today {27, 9, 2019}; Date tomorrow {next_date(today)}; if (today < tomorrow) { // ... } Date today {27, 9, 2019}; Date tomorrow {today.next_date()}; if (today < tomorrow) { // ... }
4 / 82
How does it work?
Date today {27, 9, 2019}; Date tomorrow {next_date(today)}; if (operator<(today, tomorrow)) { // ... } Date today {27, 9, 2019}; Date tomorrow {today.next_date()}; if (today.operator<(tomorrow)) { // ... }
5 / 82
How does it work?
6 / 82
this
struct Date { // ... }; void increase_year(Date& date) { ++(date.year); } // ... class Date { // ... void increase_year() { ++(this->year); } // ... };
6 / 82
this
struct Date { // ... }; void increase_year(Date& date) { ++(date.year); } // ... class Date { // ... void increase_year() { ++year; } // ... };
7 / 82
this
8 / 82
When is this mandatory? class Date { // ... void set_year(int year) { year = year; } };
8 / 82
When is this mandatory? class Date { // ... void set_year(int year) { this->year = year; } };
8 / 82
When is this mandatory? class Date { // ... void set_year(int y) { year = y; } };
9 / 82
When is this mandatory?
year.
10 / 82
Why though? Date today {27, 9, 2019}; today.day = 48; // should not be allowed
11 / 82
Why though?
12 / 82
private & public
class Date { public: bool operator<(Date const& d) const { // ... } Date next_date() { // ... } private: int day; int month; int year; };
12 / 82
private & public
class Date { public: bool operator<(Date const& d) const { // ... } Date next_date() { // ... } private: int day; int month; int year; }; int main() { Date today {27, 9, 2019}; // not allowed today.day = 48; }
12 / 82
private & public
class Date { public: bool operator<(Date const& d) const { // ... } Date next_date() { // ... } private: int day; int month; int year; }; int main() { // will not work Date today {27, 9, 2019}; // not allowed today.day = 48; }
13 / 82
private & public
14 / 82
private & public
private, meaning only a member funcon has access
15 / 82
Constructors
class Date { public: Date(int d, int m, int y) // member initialization list : day{d}, month{m}, year{y} { } // ... private: int day; int month; int year; };
15 / 82
Constructors
class Date { public: Date(int d, int m, int y) // member initialization list : day{d}, month{m}, year{y} { } // ... private: int day; int month; int year; }; int main() { // works! Date today {27, 9, 2019}; // not allowed today.day = 48; }
16 / 82
Constructors
17 / 82
Constructors
18 / 82
Member inializaon list
{...} or (...).
19 / 82
Declaraon & Definion
class Date; // class declaration class Date // class definition { // ... Date(int d, int m, int y); // declare a construtor void increase_year(); // declare a member function // ... private: // data members int day; int month; int year; }; Date::Date(int d, int m, int y) // define a construtor : day{d}, month{m}, year{y} // member initialization list { } void Date::increase_year() // define a member function { ++year; }
20 / 82
Declaraon & Definion
21 / 82
const member funcons class Date { // ... int get_day() { day = 7; // allowed return day; } };
21 / 82
const member funcons class Date { // ... int get_day() const { day = 7; // NOT allowed return day; } };
22 / 82
const member funcons
23 / 82
const member funcons
24 / 82
const member funcons
class Date { // ... int get_day() { return day; } // ... }; Date d1{27, 9, 2019}; cout << d1.get_day() << endl; Date const d2{28, 9, 2019}; // doesn't work cout << d2.get_day() << endl;
24 / 82
const member funcons
class Date { // ... int get_day() const { return day; } // ... }; Date d1{27, 9, 2019}; cout << d1.get_day() << endl; Date const d2{28, 9, 2019}; // works! cout << d2.get_day() << endl;
25 / 82
const member funcons
26 / 82
Inner class
class Outer { public: void fun(); class Inner { public: void fun(); }; }; void Outer::fun() { // ... } void Outer::Inner::fun() { // ... } Outer o{};
Outer::Inner i{}; // works! i.fun();
26 / 82
Inner class
class Outer { public: void fun(); private: class Inner { public: void fun(); }; }; void Outer::fun() { // ... } void Outer::Inner::fun() { // ... } Outer o{};
Outer::Inner i{}; // doesn't work i.fun();
27 / 82
Inner class
28 / 82
friend
class Date { // ... private: int day; int month; int year; friend bool same_month(Date d1, Date d2); }; bool same_month(Date d1, Date d2) { return d1.year == d2.year && d1.month == d2.month; }
29 / 82
friend
31 / 82
What is a pointer? int x{5}; int y{7};
31 / 82
What is a pointer? int x{5}; int y{7};
x
5
y
7
31 / 82
What is a pointer? int x{5}; int y{7}; int* ptr{};
x
5
y
7
31 / 82
What is a pointer? int x{5}; int y{7}; int* ptr{};
x
5
y
7
ptr
31 / 82
What is a pointer? int x{5}; int y{7}; int* ptr{&x};
x
5
y
7
ptr
31 / 82
What is a pointer? int x{5}; int y{7}; int* ptr{&x};
x
5
y
7
ptr
31 / 82
What is a pointer? int x{5}; int y{7}; int* ptr{&x}; ptr = &y;
x
5
y
7
ptr
31 / 82
What is a pointer? int x{5}; int y{7}; int* ptr{&x}; ptr = &y;
x
5
y
7
ptr
32 / 82
What is a pointer?
33 / 82
What is a pointer?
34 / 82
How to use a pointer int x{5}; int *ptr{&x}; cout << *ptr << endl;
x
5
ptr
34 / 82
How to use a pointer int x{5}; int *ptr{&x}; cout << *ptr << endl;
x
5
ptr
34 / 82
How to use a pointer int x{5}; int *ptr{&x}; cout << *ptr << endl;
x
5
ptr
35 / 82
How to use a pointer
36 / 82
Poinng to nothing int* ptr{}; ptr == nullptr;
37 / 82
Poinng to nothing
nullptr.
38 / 82
Manual memory int* ptr{};
38 / 82
Manual memory int* ptr{};
ptr
38 / 82
Manual memory int* ptr{new int{5}};
ptr
38 / 82
Manual memory int* ptr{new int{5}};
ptr
5
38 / 82
Manual memory int* ptr{new int{5}};
ptr
5
38 / 82
Manual memory int* ptr{new int{5}}; *ptr = 7;
ptr
5
38 / 82
Manual memory int* ptr{new int{5}}; *ptr = 7;
ptr
7
38 / 82
Manual memory int* ptr{new int{5}}; *ptr = 7; delete ptr;
ptr
7
38 / 82
Manual memory int* ptr{new int{5}}; *ptr = 7; delete ptr;
ptr
38 / 82
Manual memory int* ptr{new int{5}}; *ptr = 7; delete ptr; ptr = nullptr;
ptr
38 / 82
Manual memory int* ptr{new int{5}}; *ptr = 7; delete ptr; ptr = nullptr;
ptr
39 / 82
Manual memory
40 / 82
Manual memory
42 / 82
43 / 82
Node struct Node { int value; Node* next; }; Node n2 {2, nullptr}; Node n1 {8, &n2}; Node* first {&n1};
43 / 82
Node struct Node { int value; Node* next; }; Node n2 {2, nullptr}; Node n1 {8, &n2}; Node* first {&n1};
first value
8
next value
2
next
43 / 82
Node struct Node { int value; Node* next; }; Node n2 {2, nullptr}; Node n1 {8, &n2}; Node* first {&n1};
first 8 2
44 / 82
Node
45 / 82
Accessing data in Node Node n2 {2, nullptr}; Node n1 {8, &n2}; Node* first {&n1}; cout << (*first).value << endl;
45 / 82
Accessing data in Node Node n2 {2, nullptr}; Node n1 {8, &n2}; Node* first {&n1}; cout << first->value << endl;
46 / 82
Accessing data in Node
47 / 82
List class List { public: // ... private: Node* first{}; };
48 / 82
insert
class List { public: void remove(); void insert(int value) { Node* tmp{new Node{value}}; tmp->next = first; first = tmp; } private: Node* first{}; };
first
48 / 82
insert
class List { public: void remove(); void insert(int value) { Node* tmp{new Node{value}}; tmp->next = first; first = tmp; } private: Node* first{}; };
first 9
48 / 82
insert
class List { public: void remove(); void insert(int value) { Node* tmp{new Node{value}}; tmp->next = first; first = tmp; } private: Node* first{}; };
first 9 tmp
48 / 82
insert
class List { public: void remove(); void insert(int value) { Node* tmp{new Node{value}}; tmp->next = first; first = tmp; } private: Node* first{}; };
first 9 tmp
48 / 82
insert
class List { public: void remove(); void insert(int value) { Node* tmp{new Node{value}}; tmp->next = first; first = tmp; } private: Node* first{}; };
first 9 tmp
48 / 82
insert
class List { public: void remove(); void insert(int value) { Node* tmp{new Node{value}}; tmp->next = first; first = tmp; } private: Node* first{}; };
first 9 4
48 / 82
insert
class List { public: void remove(); void insert(int value) { Node* tmp{new Node{value}}; tmp->next = first; first = tmp; } private: Node* first{}; };
first 9 4 tmp
48 / 82
insert
class List { public: void remove(); void insert(int value) { Node* tmp{new Node{value}}; tmp->next = first; first = tmp; } private: Node* first{}; };
first 9 4 tmp
48 / 82
insert
class List { public: void remove(); void insert(int value) { Node* tmp{new Node{value}}; tmp->next = first; first = tmp; } private: Node* first{}; };
first 9 4 tmp
48 / 82
insert
class List { public: void remove(); void insert(int value) { Node* tmp{new Node{value}}; tmp->next = first; first = tmp; } private: Node* first{}; };
first 9 4
49 / 82
insert
50 / 82
A problem!
class List { public: void remove() { first = first->next; } void insert(int value); private: Node* first{}; };
first 9 4
50 / 82
A problem!
class List { public: void remove() { first = first->next; } void insert(int value); private: Node* first{}; };
first 9 4
50 / 82
A problem!
class List { public: void remove() { first = first->next; } void insert(int value); private: Node* first{}; };
first 9 4
50 / 82
A problem!
class List { public: void remove() { first = first->next; } void insert(int value); private: Node* first{}; };
first 9 4
50 / 82
A problem!
class List { public: void remove() { first = first->next; } void insert(int value); private: Node* first{}; };
first 9 4
51 / 82
A problem!
52 / 82
Let’s try again!
class List { public: void remove() { Node* tmp = first; first = first->next; delete tmp; } void insert(int value); private: Node* first{}; };
first 9 4
52 / 82
Let’s try again!
class List { public: void remove() { Node* tmp = first; first = first->next; delete tmp; } void insert(int value); private: Node* first{}; };
first 9 4
52 / 82
Let’s try again!
class List { public: void remove() { Node* tmp = first; first = first->next; delete tmp; } void insert(int value); private: Node* first{}; };
first 9 4 tmp
52 / 82
Let’s try again!
class List { public: void remove() { Node* tmp = first; first = first->next; delete tmp; } void insert(int value); private: Node* first{}; };
first 9 4 tmp
52 / 82
Let’s try again!
class List { public: void remove() { Node* tmp = first; first = first->next; delete tmp; } void insert(int value); private: Node* first{}; };
first 9 tmp
52 / 82
Let’s try again!
class List { public: void remove() { Node* tmp = first; first = first->next; delete tmp; } void insert(int value); private: Node* first{}; };
first 9
53 / 82
Let’s try again!
delete on the nodes that are le.
55 / 82
Destructor
class List { public: List() // constructor : first{nullptr} { } ~List() // destructor { // go through each node in our list and call delete on them } void remove(); void insert(int value); private: Node* first{}; };
56 / 82
Destructor
57 / 82
Constructors & destructors
{ List my_list{}; // the constructor is called // do things with the list } // the destructor is called
58 / 82
Constructors & destructors
59 / 82
Copies
int main() { List my_list{}; my_list.insert(5); my_list.insert(2); { // copy my_list into copy List copy {my_list}; } }
first my_list first copy 2 5
59 / 82
Copies
int main() { List my_list{}; my_list.insert(5); my_list.insert(2); { // copy my_list into copy List copy {my_list}; } }
first my_list first copy 2 5
59 / 82
Copies
int main() { List my_list{}; my_list.insert(5); my_list.insert(2); { // copy my_list into copy List copy {my_list}; } }
first my_list
59 / 82
Copies
int main() { List my_list{}; my_list.insert(5); my_list.insert(2); { // copy my_list into copy List copy {my_list}; } }
first my_list
59 / 82
Copies
int main() { List my_list{}; my_list.insert(5); my_list.insert(2); { // copy my_list into copy List copy {my_list}; } }
first my_list
60 / 82
Copies
first pointer, not its content.
61 / 82
Deep copies
first my_list 2 5 first copy
61 / 82
Deep copies
first my_list 2 5 first copy 2
61 / 82
Deep copies
first my_list 2 5 first copy 2 5
62 / 82
Deep copies
my_list into copy (in the same order).
63 / 82
Copy constructor
class List { public: List(); // default constructor List(List const& other) { // perform a deep copy of the lists } ~List(); // destructor void remove(); void insert(int value); private: Node* first{}; };
64 / 82
Copy constructor
65 / 82
Copy assignment List my_list{}; my_list.insert(5); my_list.insert(2); List copy{}; copy.insert(1); copy.insert(4); // copy assignment copy = my_list;
66 / 82
Copy assignment
67 / 82
Copy assignment
first my_list 2 5 first copy 4 1
67 / 82
Copy assignment
first my_list 2 5 first copy 4 1 2 5
67 / 82
Copy assignment
first my_list 2 5 first copy 4 1 2 5
67 / 82
Copy assignment
first my_list 2 5 first copy 4 1 2 5
67 / 82
Copy assignment
first my_list 2 5 first copy
68 / 82
Copy assignment
69 / 82
Copy assignment
first my_list 2 5 first copy 4 1
69 / 82
Copy assignment
first my_list 2 5 first copy 4 1 2 5
69 / 82
Copy assignment
first my_list 2 5 first copy 2 5
69 / 82
Copy assignment
first my_list 2 5 first copy 2 5
70 / 82
Copy assignment operator
class List { public: List(); // default constructor List(List const& other); // copy constructor ~List(); // destructor List& operator=(List const& other) { // remove previous list and deep copy other return *this; } // ... };
71 / 82
Copy assignment operator
72 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list
72 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first list
72 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first list 3 5
72 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first list 3 5 first
72 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first list 3 5 first 3 5
72 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first list first 3 5
72 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first 3 5
72 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first 3 5 3 5
72 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first 3 5
72 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list 3 5
73 / 82
Temporary objects
74 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list
74 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first list
74 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first list 3 5
74 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first list 3 5 first
74 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first list 3 5 first
74 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list first list 3 5 first
74 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list 3 5 first
74 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list 3 5 first
74 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list 3 5 first
74 / 82
Temporary objects
List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list {get_list()};
first my_list 3 5
75 / 82
Temporary objects
nullptr since othewise the destructor of the
76 / 82
Temporary objects
77 / 82
Move constructor
class List { public: List(); // default constructor List(List const& other); // copy constructor List(List&& other) { // perform the move by shuffling the first pointers } ~List(); // destructor List& operator=(List const& other); // copy assignment operator // ... };
78 / 82
Move assignment List get_list() { List list{}; list.insert(5); list.insert(3); return list; } List my_list{}; my_list.insert(4); my_list.insert(2); my_list = get_list();
79 / 82
Move assignment operator
class List { public: List(); // default constructor List(List const& other); // copy constructor List(List&& other); // move constructor ~List(); // destructor List& operator=(List const& other); // copy assignment operator List& operator=(List&& other) { // remove old content of the list // move content from other to this object } // ... };
80 / 82
Special Member Funcons
class List { public: List(); // default constructor List(List const& other); // copy constructor List(List&& other); // move constructor ~List(); // destructor List& operator=(List const& other); // copy assignment operator List& operator=(List&& other); // move assignment operator // ... };
81 / 82
Nice inializaon List list1 {1, 2, 3}; List list2 {4, 5}; List list3 {6, 7, 8, 9};
#include <initializer_list> class List { public: List(std::initializer_list<int> list) { for (int i : list) { insert(i); } } };
82 / 82
Nice inializaon
std::initializer_list as argument.