• No results found

TDP004 Objektorienterad programmering

N/A
N/A
Protected

Academic year: 2022

Share "TDP004 Objektorienterad programmering"

Copied!
56
0
0

Loading.... (view fulltext now)

Full text

(1)

TDP004 ‐

Objektorienterad programmering

Pekare, inre klasser och speciella medlemsfunktioner

János Dani & Pontus Haglund

Institutionen för datavetenskap

(2)

2 Pekare 3 Inre klasser

4 Speciella medlemsfunktioner 5 Slumpgenerering

6 Rekursion

(3)

2 Pekare 3 Inre klasser

4 Speciella medlemsfunktioner 5 Slumpgenerering

6 Rekursion

(4)

Mål med föreläsningen

Efter föreläsningen skall studenten kunna:

‚ Förstå och arbeta med pekare.

‚ Visualisera datorns minne.

‚ Skapa och hantera inre klasser.

‚ Skapa och hantera speciella medlemsfunktioner.

‚ Slumpgenerering i C++.

‚ Lösa problem rekursivt i C++

(5)

2 Pekare 3 Inre klasser

4 Speciella medlemsfunktioner 5 Slumpgenerering

6 Rekursion

(6)

Pekare

Pekare

(7)

Pekare

Vad är en pekare?

char x{'A'};

char y{'B'};

(8)

Pekare

Vad är en pekare?

char x{'A'};

char y{'B'};

x 'A'

y 'B'

(9)

Pekare

Vad är en pekare?

char x{'A'};

char y{'B'};

char* ptr{};

x 'A'

y 'B'

(10)

Pekare

Vad är en pekare?

char x{'A'};

char y{'B'};

char* ptr{};

x 'A'

y 'B'

ptr

(11)

Pekare

Vad är en pekare?

char x{'A'};

char y{'B'};

char* ptr{&x};

x 'A'

y 'B'

ptr

(12)

Pekare

Vad är en pekare?

char x{'A'};

char y{'B'};

char* ptr{&x};

x 'A'

y 'B'

ptr

(13)

Pekare

Vad är en pekare?

char x{'A'};

char y{'B'};

char* ptr{&x};

ptr = &y;

x 'A'

y 'B'

ptr

(14)

Pekare

Vad är en pekare?

char x{'A'};

char y{'B'};

char* ptr{&x};

ptr = &y;

x 'A'

y 'B'

ptr

(15)

Pekare

C++ pekare

int main() {

string text{"Hi"};

string* pointer{&text};

cout << "Address: "

<< pointer << "\n";

cout << "Data: "

<< *pointer << endl;

}

(16)

Pointers

Hur använder jag en pekare?

string text{"Hi"};

string* pointer{&text};

cout << "Address: "

<< pointer << "\n";

cout << "Data: "

<< *pointer << endl;

text "Hi"

pointer

(17)

Pointers

Hur använder jag en pekare?

string text{"Hi"};

string* pointer{&text};

cout << "Address: "

<< pointer << "\n";

cout << "Data: "

<< *pointer << endl;

text "Hi"

pointer

(18)

Pointers

Hur använder jag en pekare?

string text{"Hi"};

string* pointer{&text};

cout << "Address: "

<< pointer << "\n";

cout << "Data: "

<< *pointer << endl;

text "Hi"

pointer

(19)

Pekare

Manuellt minne (heapen)

char* pointer{};

(20)

Pekare

Manuellt minne (heapen)

char* pointer{};

pointer

(21)

Pekare

Manuellt minne (heapen)

char* pointer{new char{'A'}};

pointer 'A'

(22)

Pekare

Manuellt minne (heapen)

char* pointer{new char{'A'}};

pointer 'A'

(23)

Pekare

Manuellt minne (heapen)

char* pointer{new char{'A'}};

pointer 'A'

(24)

Pekare

Manuellt minne

{

char* pointer{new char{'A'}};

}

cout << "slut";

(25)

Pekare

Manuellt minne

{

char* pointer{new char{'A'}};

}

cout << "slut";

(26)

Pekare

Manuellt minne

{

char* pointer{new char{'A'}};

}

cout << "slut";

pointer 'A'

(27)

Pekare

Manuellt minne

{

char* pointer{new char{'A'}};

}

cout << "slut";

'A'

(28)

Pekare

Manuellt minne

{

char* pointer{new char{'A'}};

}

cout << "slut";

'A'

(29)

Pekare

Manuellt minne ‐ delete

{

char* pointer{new char{'A'}};

delete pointer;

pointer = nullptr;

}

cout << "slut";

(30)

Pekare

Manuellt minne ‐ delete

{

char* pointer{new char{'A'}};

delete pointer;

pointer = nullptr;

}

cout << "slut";

(31)

Pekare

Manuellt minne ‐ delete

{

char* pointer{new char{'A'}};

delete pointer;

pointer = nullptr;

}

cout << "slut";

pointer 'A'

(32)

Pekare

Manuellt minne ‐ delete

{

char* pointer{new char{'A'}};

delete pointer;

pointer = nullptr;

}

cout << "slut";

pointer

(33)

Pekare

Manuellt minne ‐ delete

{

char* pointer{new char{'A'}};

delete pointer;

pointer = nullptr;

}

cout << "slut";

pointer

(34)

Pekare

Manuellt minne ‐ delete

{

char* pointer{new char{'A'}};

delete pointer;

pointer = nullptr;

}

cout << "slut";

(35)

Pekare

Manuellt minne ‐ delete

{

char* pointer{new char{'A'}};

delete pointer;

pointer = nullptr;

}

cout << "slut";

(36)

Pekare

Pekare och medlemsfunktioner

int main() {

string* pointer{ new string{"A string"} };

cout << (*pointer).substr(0,3) << "\n";

cout << pointer -> substr(0,3) << endl;

delete new_pointer;

}

(37)

2 Pekare 3 Inre klasser

4 Speciella medlemsfunktioner 5 Slumpgenerering

6 Rekursion

(38)

Inre klasser

Inre klasser

(39)

Inre klasser

C++ inre klass

class Snake {

private:

struct Segment;

public:

Snake(int x,inty);

voidprint()const;

voidadd(int x,int y);

private:

Segment* head;

struct Segment {

int x;

int y;

Segment* next;

};

};

(40)

Inre klasser

C++ inre klass

‚ Inre klasser kan vara smidigt om man behöver en klass som stöd för att lösa det övergripande problemet men inte vill att användaren ska skapa objekt av denna typ

‚ I

Snake

exempelvis vill vi bara att användaren skapar objekt av typen

Snake

men vi behöver objekt av typen

Segment

för att lösa vår länkade struktur.

‚ Inre klasser kan ofta vara aggregat vilket är fallet i

Segment

‐ Detta innebär att objekt av denna typ bara har

publika datamedlemmar. De kan också ha Destruktor

och Konstruktorer om detta behövs.

(41)

2 Pekare 3 Inre klasser

4 Speciella medlemsfunktioner 5 Slumpgenerering

6 Rekursion

(42)

Speciella medlemsfunktioner

Lista

int main() {

List my_list{};

my_list.insert(1);

my_list.insert(2);

}

(43)

Speciella medlemsfunktioner

Rule of three, five, zero

I vanliga fall kan c++ hantera kopiering, flytt och borttagning av objekt av klasstyp. Även när de är användardefinerade.

MEN i fall där objekt av våra egna klasstyper har pekare som datamedlemmar, framförallt pekare till manuellt allokerat minne så kommer vi behöva definera hur detta ska fungera i vår klass. Regeln är att vi antingen definerar alla eller ingen av dessa speciella medlemsfunktioner. Regeln kan du läsa här:

https://en.cppreference.com/w/cpp/language/rule_of_three

(44)

Speciella medlemsfunktioner

Kopiering

int main() {

List my_list{};

my_list.insert(1);

my_list.insert(2);

List copy{my_list};

List new_list{};

new_list.insert(3);

new_list = copy;

}

(45)

Kopiering ‐ header

Följande konstruktor och operator behöver deklareras och defineras:

class List {

public:

//...

List(List const& other);

List& operator=(List const& other);

private:

//...

}

(46)

Kopiering ‐ vad ska hända

‚ För en länkad lista ska datan som sparas i varje länkat element kopieras

‚ Listan som kopieras från skall lämnas intakt

‚ Efter körning bör alla värden som finns i den andra listan finnas i denna lista

MEN listorna måste ha sina egna element

(47)

Speciella medlemsfunktioner

Flytt

int main() {

List my_list{};

my_list.insert(1);

my_list.insert(2);

List copy{ move(my_list) };

List new_list{};

new_list.insert(3);

new_list = move(copy);

}

(48)

Flytt ‐ header

Följande konstruktor och operator behöver deklareras och defineras:

class List {

public:

//...

List(List && other);

List& operator=(List && other);

private:

//...

}

(49)

Flytt ‐ vad ska hända

‚ För en länkad lista ska varje länkat element flyttas till den nya listan

‚ Listan som flytten sker från kan lämnas tom efter flytten

(50)

Destruktor

Eftersom vi har datamedlemmar som är pekare behöver vi också deklarera och definera destruktorn:

class List {

public:

//...

~List();

private:

//...

}

(51)

‚ Destruktorn har som ansvar att lämna tillbaka allt minne som objekt av klasstypen äger

‚ För en länkad lista innebär detta vanligtvis alla länkade element som listan består av

‚ Detta kan göras iterativt eller rekursivt.

‚ Oavsett lösning måste vi se till att

delete

körs på varje

länkat element i listan

(52)

2 Pekare 3 Inre klasser

4 Speciella medlemsfunktioner 5 Slumpgenerering

6 Rekursion

(53)

Slumpgenerering

Random

int main()

// Exempel anpassat från en.cppreference.com {

random_device rd;

mt19937 gen(rd());

uniform_int_distribution<int> dis(1, 6);

for (int n=0; n<10; ++n) {

// Distributionen använder generatorn // för att välja ett tal i sitt intervall cout << dis(gen) << ' ';

}

cout << endl;

}

(54)

2 Pekare 3 Inre klasser

4 Speciella medlemsfunktioner 5 Slumpgenerering

6 Rekursion

(55)

Rekursion

Kopiera ett träd

int main() {

Tree my_tree{1,2,3,4,5,6};

Tree copy{my_tree};

}

(56)

References

Related documents

En modellklass LifeModel i ett program som kan simulera denna utveckling lagrar den aktuella generationen i en tillståndsvariabel med deklarationen.. private

plats för en referens till ett objekt av typen SegelPlan plats för en referens till ett objekt av typen String int length=0; // man kan ange ett initialt värde.

En bokning är möjlig när tidsintervallet inte överlappar tidsintervallet för någon av de redan existerande bokningarna. Klassen ska också ha

kommer denna klass att ärva sina egenskaper från Media , men att set och get metoder för klassens två fält ska finnas.. Är antalet sidor fler än 1 så skrivs pages ut

‚ T är e namn som berä ar vart kompilatorn ska fylla ut med typer som användaren anger.. ‚ T kallas för

● När det kommer till heltal, bestäms den närmaste typen, storleksmässigt, som kan lagra

I Detta innebär i förlängningen att funktioner deklarerade med static inte kan komma åt variabler deklarerade utan static eftersom det inte är specificerat vilken

Rättigheterna visas (via ls -l) som tre grupper med rwx där r står för läsrättighet, w för skrivrättighet och x för rättigheten att exekvera filen.. Första gruppen