ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ

Dimitris Psounis
Dimitris PsounisTeacher & Manager at Δημήτρης Ψούνης - Υπηρεσίες Εκπαίδευσης à www.psounis.gr
H ΓΛΩΣΣΑ C++
Μάθημα 3:
Κλάσεις και Δείκτες
Δημήτρης Ψούνης
Περιεχόμενα Μαθήματος
Α. Θεωρία
1. Διαχείριση Μνήμης
1. Στατική Δέσμευση Μνήμης
2. Στατική Δέσμευση Μνήμης για
Συνήθεις Μεταβλητές
3. Στατική Δέσμευση Μνήμης για
Αντικείμενα
2. Δυναμική Δέσμευση Μνήμης
1. Δείκτες (Υπενθύμιση από C)
2. Οι τελεστές new και delete
3. Δυναμική Δέσμευση για Συνήθεις
Μεταβλητές
4. Δυναμική Δέσμευση για Αντικείμενα
5. Δυναμική Δέσμευση και
Κατασκευαστές
2Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
3. Κλάσεις που περιέχουν δείκτες
1. Παράδειγμα κλάσης που περιέχει
δείκτες
2. …και ένα πρόβλημα (χωρίς λύση για
την ώρα)
4. Δυναμική Δέσμευση Μνήμης για
Πίνακες
1. Μονοδιάστατοι πίνακες
2. Παράδειγμα δέσμευσης μνήμης για
μονοδιάστατους πίνακες
3. Διδιάστατοι πίνακες
4. Παράδειγμα δέσμευσης μνήμης για
διδιάστατους πίνακες
B. Ασκήσεις
A. Θεωρία
1. Διαχείριση Μνήμης
1. Στατική και Δυναμική Δέσμευση Μνήμης
3Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Η διαχείριση μνήμης στη C++ γίνεται με παρόμοιο τρόπο με τη C.
• Τα παρακάτω είναι εντελώς αντίστοιχα:
• Στατική Δέσμευση Μνήμης:
• Είναι γνωστός εκ των προτέρων ο χώρος μνήμης που απαιτείται για τα στιγμιότυπα.
• Και έχει ήδη αποφασιστεί κατά το χρόνο μεταγλώττισης (π.χ. δηλώνουμε έναν πίνακα 10
θέσεων)
• Οι τοπικές μεταβλητές αποθηκεύονται στον χώρο της συνάρτησης (στοίβα – stack)
• Δυναμική Δέσμευση Μνήμης:
• Δεν είναι γνωστός εκ των προτέρων ο χώρος μνήμης που πρέπει να δεσμεύσει το
πρόγραμμά μας.
• Αλλά αποφασίζεται κατά το χρόνο εκτέλεσης (π.χ. ο χρήστης αποφασίζει πόσες θέσεις θα
έχει ένας πίνακας που χρησιμοποιεί το πρόγραμμα)
• Ο χώρος μνήμης που δεσμεύεται δυναμικά είναι κοινός για όλες τις συναρτήσεις (σωρός –
heap)
A. Θεωρία
1. Διαχείριση Μνήμης
2. Στατική Δέσμευση μνήμης για συνήθεις μεταβλητές
4Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
/* CPP3.local_variables.cpp */
#include <iostream>
using namespace std;
void f()
{
int y=3;
cout<<"inside f";
}
int main()
{
int x=5;
cout<<"inside main";
f();
return 0;
}
• Κάθε συνάρτηση έχει το δικό της χώρο μνήμης.
• Κάθε τοπική μεταβλητή αποθηκεύεται στο χώρο μνήμης της
συνάρτησης στην οποία ανήκει.
• Σχηματικά, για το παράδειγμα:
• Αυτός ο χώρος μνήμης καλείται και στοίβα (stack), λόγω του
τρόπου με τον οποίο εχει υλοποιηθεί η κλήση των
συναρτήσεων σε μία στοίβα:
main
f
A. Θεωρία
1. Διαχείριση Μνήμης
3. Στατική Δέσμευση μνήμης για Αντικείμενα
5Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Ένα αντικείμενο αποθηκεύεται στη μνήμη ως εξής:
• Τα μέλη του βρίσκονται σε διαδοχικές θέσεις μνήμης
• Προσοχή, οι μέθοδοι βρίσκονται σε άλλο χώρο (είναι κοινές για όλα τα αντικείμενα της κλάσης)
• Ο τελεστής sizeof μπορεί να χρησιμοποιήθεί για να μετρήσουμε το πλήθος των bytes που
χρησιμοποιεί ένα αντικείμενο.
• Παράδειγμα:
/* CPP3.sizeof.cpp
Μέγεθος αντικειμένου */
#include <iostream>
using namespace std;
class dummy {
public:
int x;
int y;
};
int main()
{
dummy ob;
ob.x = 3; ob.y = 5;
cout<<sizeof ob<<endl;
return 0;
}
• Θα τυπώσει 8 (δύο ακέραιοι 4bytes ο
καθένας)
• Και η εικόνα της μνήμης:
A. Θεωρία
2. Δυναμική Δέσμευση Μνήμης
1. Δείκτες (Υπενθύμιση από C)
6Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Ένας δείκτης είναι μια μεταβλητή που αποθηκεύει διευθύνσεις μεταβλητών
• Ένας δείκτης δηλώνεται ως εξής:
• Όπου ΤΔ είναι ένας οποιοσδήποτε τύπος δεδομένων (int, float, double κ.λπ.)
• Π.χ. ένας δείκτης σε ακέραιο δηλώνεται με τη δήλωση:
• Αποθηκεύουμε σε έναν δείκτη την διεύθυνση μιας μεταβλητής με τη δήλωση:
• O τελεστής & επιστρέφει τη διεύθυνση της μεταβλητής στην οποία εφαρμόζεται.
• Π.χ. αποθηκεύουμε στον δείκτη ptr τη διεύθυνση μιας μεταβλητής x με την εντολή:
• και λέμε «ο δείκτης ptr δείχνει στην μεταβλητή x»
ΤΔ *pointer_name;
int *ptr;
pointer_name = &variable;
ptr = &x;
• Αναλυτικά βλ. και «Γλώσσα C – Μάθημα 8: Δείκτες»
A. Θεωρία
2. Δυναμική Δέσμευση Μνήμης
1. Δείκτες (Υπενθύμιση από C)
7Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
/* CPP3.pointers.cpp */
#include <iostream>
using namespace std;
int main()
{
int x=5;
int *p = NULL;
p = &x;
cout<<"x = "<<x<<" (address: "<<&x<<")"<<endl;
cout<<"*p = "<<*p<<" (address: "<<p<<")"<<endl;
return 0;
}
• Το πρόγραμμα δείχνει την βασική ιδιότητα:
• Για ένα δείκτη (p) που «δείχνει» σε μία
μεταβλητη ισχύουν:
• To NULL είναι μία ειδική τιμή
• που συμβολίζει ότι ο δείκτης δεν
δείχνει κάπου.
• Είναι καλό ένας δείκτης που δεν δείχνει
κάπου να έχει την τιμή NULL
• H τιμη του NULL είναι 0.
• Σχηματικά:
p == &x //Διεύθυνση της x
*p == x // Τιμή της x
A. Θεωρία
2. Δυναμική Δέσμευση Μνήμης
2. Οι τελεστές new και delete
8Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Ο τελεστής new χρησιμοποιείται για να δεσμεύσει δυναμικά χώρο μνήμης
• Αντικαθιστά τη malloc της C.
• Η σύνταξη του είναι:
• Δεσμεύει χώρο μνήμης για ένα αντικείμενου τύπου type και επιστρέφει έναν δείκτη σε
αυτόν το χώρο
• Ο χώρος μνήμης που δεσμεύεται δυναμικά, είναι κοινός για όλες τις συναρτήσεις και
ονομάζεται σωρός (heap)
• Προσοχή, αν αποτύχει η δέσμευση (δεν υπάρχει χώρος) επιστρέφει NULL
• και θα πρέπει πάντα να ελέγχουμε ότι η δέσμευση έγινε επιτυχημένα
ptr = new type;
• Ο τελεστής delete χρησιμοποιείται για να απόδεσμευσει χώρο μνήμης που έχει δεσμευτεί
δυναμικά
• Αντικαθιστά τη free της C.
• Η σύνταξη του είναι:
delete ptr;
A. Θεωρία
2. Δυναμική Δέσμευση Μνήμης
2. Οι τελεστές new και delete (Έλεγχος Δέσμευσης Μνήμης)
9Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Πάντα πρέπει να κάνουμε έλεγχο αν η μνήμη που αιτηθήκαμε με τη new, έχει όντως δεσμευτεί.
• Βλέπουμε τρεις τρόπους για να «πιάσουμε» το πρόβλημα:
• A’ τρόπος: Ο πιο απλός, μιας και απλά ελέγχουμε την επιστρεφόμενη τιμή:
• Β’ τρόπος: Πιο ψαγμένος, ξέρουμε ότι το NULL είναι 0 (και για να είμαστε ακριβής (void *) 0)
• Και ξέρουμε ότι το 0, είναι το λογικό ψευδές
• και το !0 είναι το λογικό αληθές:
• Γ’τρόπος: Ο πιο σύνθετος και φαντεζί, αλλά ενσωματώνει τις δύο εντολές σε μία γραμμή:
• Στις σημειώσεις θα χρησιμοποιήσουμε κυρίως το Β’ τρόπο
• Και θα βγάζουμε απλά ένα ενημερωτικό μήνυμα (αργότερα θα μπορούμε να κάνουμε και
περισσότερα πράγματα, με τις εξαιρέσεις της C++)
ptr = new type;
if (ptr==NULL)
{ …. do some action… }
ptr = new type;
if (!ptr)
{ …. do some action… }
if (!(ptr = new type))
{ …. do some action… }
A. Θεωρία
2. Δυναμική Δέσμευση Μνήμης
3. Δυναμική Δέσμευση για Συνήθεις Μεταβλητές
10Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Το παράδειγμα δείχνει τη δέσμευση
μνήμης για έναν ακέραιο αριθμό, τόσο
στατικά όσο και δυναμικά:
#include <iostream> // CPP3.dynamic_variable.cpp
using namespace std;
int main()
{
int x; // Μεταβλητή που δεσμέυει στατικό χώρο
int *p; // Δείκτης σε ακέραιο
p = new int; // Δυναμική δέσμευση μνήμης
if (!p) cout<<“Error allocating memory”;
/* Αναθέσεις τιμών */
x = 1;
*p = 5;
/* Εκτυπώσεις */
cout<<"x = "<<x<<" (address: "<<&x<<")"<<endl;
cout<<"*p = "<<*p<<" (address: "<<p<<")"<<endl;
delete p; // Αποδέσμευση μνήμης
return 0;
}
Υπενθυμίσεις από τη C:
• Η x δεσμεύει χώρο μνήμης μέσα στο χώρο
μνήμης της συνάρτησης
• Ο χώρος που δεσμεύεται δυναμικά μέσω
της p, είναι ένας ξεχωριστός χώρος, κοινός
για όλο το πρόγραμμα
• (λέγεται και σωρός – heap)
• Σχηματικά:
A. Θεωρία
2. Δυναμική Δέσμευση Μνήμης
4. Δυναμική Δέσμευση για Αντικείμενα
11Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
/* CPP3.dynamic_object.cpp Δυναμική Δέσμευση
μνήμης για αντικείμενο */
#include <iostream>
using namespace std;
class dummy {
public:
int x;
};
int main()
{
dummy *p = NULL; //Θα δείξει σε αντικείμενο
p = new dummy; // Δέσμευση χώρου
if (!p) cout<<“Error allocating memory”;
/* Αναθέσεις τιμών */
p->x = 5;
/* Εκτυπώσεις */
cout<<"p->x = "<<p->x<<endl;
delete p; // Αποδέσμευση μνήμης
return 0;
}
• Αντίστοιχα (αφού μία κλάση είναι τύπος δεδομένων), μπορεί να δεσμευτεί δυναμικά χώρος
μνήμης για ένα αντικείμενο.
• Όταν χρησιμοποιούμε ένα αντικείμενο μέσω δείκτη,
• Έχουμε πρόσβαση στα δημόσια μέλη-μεθόδους μέσω του τελεστή -> (βελάκι)
• Βλέπουμε και ένα παράδειγμα:
A. Θεωρία
2. Δυναμική Δέσμευση Μνήμης
4. Δυναμική Δέσμευση για Αντικείμενα
12Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
/* CPP3.dereferencing.cpp */
#include <iostream>
using namespace std;
class dummy {
public:
int x;
};
int main()
{
dummy *p = NULL; //Θα δείξει σε αντικείμενο
p = new dummy; // Δέσμευση χώρου
if (!p) cout<<“Error allocating memory”;
/* Αναθέσεις τιμών */
(*p).x = 5;
/* Εκτυπώσεις */
cout<<"(*p).x = "<<(*p).x<<endl;
delete p; // Αποδέσμευση μνήμης
return 0;
}
• Δεδομένου ενός δείκτη που δείχνει σε ένα αντικείμενο.
• Με τον τελεστή *, έχουμε πρόσβαση στο ίδιο το αντικείμενο (dereferencing)
• Και ισχύει ότι το (*p) είναι το αντικείμενο στο οποίο δείχνει ο δείκτης.
• Συνεπώς έχουμε πρόσβαση στα δημόσια μέλη του (*p) με τον τελεστή . (τελεία)
• Βλέπουμε και ένα παράδειγμα:
A. Θεωρία
2. Δυναμική Δέσμευση Μνήμης
4. Δυναμική Δέσμευση για Αντικείμενα
13Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
/* CPP3.pointers_and_objects.cpp Δείκτης σε
αντικείμενο */
#include <iostream>
using namespace std;
class dummy {
public:
int x;
};
int main()
{
dummy ob;
dummy *p = &ob;
if (!p) cout<<“Error allocating memory”;
/* Αναθέσεις τιμών */
ob.x = 6;
/* Εκτυπώσεις */
cout<<ob.x<<" "<<p->x<<" "<<(*p).x<<endl;
return 0;
}
• Και ένα ακόμη παράδειγμα, όπου βάζουμε ένα δείκτη να δείχνει σε ένα ήδη υφιστάμενο
αντικείμενο:
• Για να τονιστεί η διαφορά στην πρόσβαση,
• απευθείας από το αντικείμενο (τελεστής .)
• μέσω δείκτη (τελεστής ->)
• μέσω dereferencing ( * και . )
A. Θεωρία
2. Δυναμική Δέσμευση Μνήμης
5. Δυναμική Δέσμευση και κατασκευαστές
14Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Όταν δημιουργούμε ένα αντικείμενο με τον τελεστή new,
• και εφόσον το αντικείμενο αυτό έχει κατασκευαστή
• πρέπει να περάσουμε και τα ορίσματα στον κατασκευαστή
• Ο κατασκευαστής καλείται όταν κάνουμε new
• Ο καταστροφέας καλείται όταν κάνουμε delete
/*
CPP3.constructor_destru
ctor.cpp */
#include <iostream>
using namespace std;
class dummy {
public:
dummy(int in_x);
~dummy();
private:
int x;
};
int main()
{
dummy *p = NULL;
p = new dummy(5); //constructing
if (!p) cout<<“Error allocating
memory”;
delete p; //destructing
return 0;
}
dummy::dummy(int in_x)
{
x = in_x;
cout<<"Constructing...";
}
dummy::~dummy()
{
cout<<"Destructing...";
}
A. Θεωρία
3. Κλάσεις που περιέχουν δείκτες
1. Παράδειγμα κλάσης που περιέχει δείκτη
15Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Ένας δείκτης είναι απλά μία μεταβλητή
• Συνεπώς μπορεί να είναι μέλος σε κλάση
• Βλέπουμε ένα απλό παράδειγμα:
• Στο οποίο δεσμεύουμε δυναμικά στον κατασκευαστή το χώρο για έναν ακέραιο
• και τον αποδεσμεύουμε στον καταστροφέα.
/* CPP3.class_with_pointer */
#include <iostream>
using namespace std;
class dummy {
public:
dummy();
~dummy();
void set_val(int in_val);
int get_val();
private:
int *p_val;
};
A. Θεωρία
3. Κλάσεις που περιέχουν δείκτες
1. Παράδειγμα κλάσης που περιέχει δείκτη
16Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
int main()
{
dummy ob;
ob.set_val(3);
cout<<endl<<ob.get_val()<<endl;
return 0;
}
dummy::dummy()
{
p_val = new int;
if (!p_val) cout<<"Error allocating memory";
cout<<"Constructing...";
}
dummy::~dummy()
{
delete p_val;
cout<<"Destructing...";
}
void dummy::set_val(int in_val)
{
*p_val = in_val;
}
int dummy::get_val()
{
return *p_val;
}
A. Θεωρία
3. Κλάσεις που περιέχουν δείκτες
2. …και ένα πρόβλημα (χωρίς λύση για την ώρα)
17Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Ας δούμε και ένα πρόβλημα που μπορεί να προκύψει όταν μία κλάση περιέχει δείκτες που
κάνουν δυναμική διαχείριση μνήμης
• Το πρόβλημα αυτό προκύπτει όταν:
• Έχουμε μία κλάση που κάνει δυναμική δέσμευση μνήμης
• Κάνουμε αντιγραφή του αντικειμένου (π.χ. ob1 = ob2)
• Μεταγλωττίστε και εκτελέστε το ακόλουθο πρόγραμμα:
/* CPP3.assignment_problem Δυναμική Δέσμευση και Τελεστής Ανάθεσης */
#include <iostream>
using namespace std;
class dummy {
public:
dummy();
~dummy();
void set_val(int in_val);
int get_val();
private:
int *p_val;
};
A. Θεωρία
3. Κλάσεις που περιέχουν δείκτες
2. …και ένα πρόβλημα (χωρίς λύση για την ώρα)
18Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
int main()
{
dummy ob1;
ob1.set_val(3);
dummy ob2;
ob2 = ob1;
cout<<ob1.get_val()<<endl;
cout<<ob2.get_val()<<endl;
return 0;
}
dummy::dummy()
{
p_val = new int;
if (!p_val) cout<<"Error allocating memory";
cout<<"Constructing...";
}
dummy::~dummy()
{
delete p_val;
cout<<"Destructing...";
}
void dummy::set_val(int in_val)
{
*p_val = in_val;
}
int dummy::get_val()
{
return *p_val;
}
• Σημαντικό! Στη C++ οι μεταβλητές μπορούν να δηλωθούν σε οποιοδήποτε μέρος του
προγράμματος (αλλά θα το αποφεύγουμε…)
A. Θεωρία
3. Κλάσεις που περιέχουν δείκτες
2. …και ένα πρόβλημα (χωρίς λύση για την ώρα)
19Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• H εκτέλεση του προγράμματος οδηγεί σε σφάλμα κατά το χρόνο εκτέλεσης:
• Για να καταλάβουμε γιατί συμβαίνει αυτό, θα δούμε την κατάσταση της μνήμης βήμα – βήμα
κατά την εκτέλεση της main
A. Θεωρία
3. Κλάσεις που περιέχουν δείκτες
2. …και ένα πρόβλημα (χωρίς λύση για την ώρα)
20Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• dummy ob1; // Δεσμεύει το χώρο για το ob1.
• ob1.set_val(3); // αποθηκεύει την τιμή 3 στο χώρο μνήμης
A. Θεωρία
3. Κλάσεις που περιέχουν δείκτες
2. …και ένα πρόβλημα (χωρίς λύση για την ώρα)
21Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• dummy ob2; // Δεσμεύει το χώρο για το ob2.
• ob2=ob1 // Δεν κάνει ακριβώς αυτό που θέλουμε…
A. Θεωρία
3. Κλάσεις που περιέχουν δείκτες
2. …και ένα πρόβλημα (χωρίς λύση για την ώρα)
22Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Τώρα με την ολοκλήρωση του προγράμματος, θα τρέξουν οι δύο destructors.
• Συνεπώς ο ίδιος χώρος μνήμης θα αποδεσμευτεί δύο φορές.
• Και αυτό οδηγεί σε σφάλμα στο χρόνο εκτέλεσης.
• Ενώ ισχύει ότι έχουμε κάνει και το βασικό λάθος
• Με την ολοκλήρωση του προγράμματος, έχει ξεμείνει χώρος μνήμης, τον οποίο
δεσμεύσαμε δυναμικά και δεν τον αποδεσμεύσαμε ποτέ (memory leak)
• Το πρόβλημα αυτό προκύπτει όταν γίνεται bit by bit αντιγραφή αντικειμένων (shallow copy)
• όπως στην περίπτωση που είδαμε,
• αλλά και σε άλλες περιπτώσεις (π.χ. όταν περνάμε ένα αντικείμενο μέσω τιμής σε μία
συνάρτηση)
• Θα αντιμετωπίσουμε το πρόβλημα αυτό, στα επόμενα μαθήματα:
• Θα μάθουμε τις αναφορές (references)
• και μέσω αυτών θα ορίσουμε τον κατασκευαστή αντιγράφου (copy constructor)
• επίσης θα μάθουμε την υπερφόρτωση του =
• και θα ορίσουμε τι πρέπει να γίνεται όταν έχουμε ανάθεση αντικειμένου
A. Θεωρία
4. Δυναμική Δέσμευση Μνήμης για Πίνακες
1. Μονοδιάστατοι Πίνακες
23Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Οι τελεστές new και delete χρησιμοποιούνται και για την δέσμευση μνήμης για πίνακες
• Δέσμευση Μνήμης:
• Η σύνταξη του τελεστή new είναι:
• Δεσμεύει χώρο μνήμης για n αντικείμενα τύπου type και επιστρέφει έναν δείκτη σε αυτόν
το χώρο
• Το n δεν χρειάζεται να είναι σταθερά.
• Αποδέσμευση Μνήμης:
• Η σύνταξη του τελεστή delete είναι:
ptr = new type [n];
delete [] ptr;
• Βλέπουμε και ένα παράδειγμα δέσμευσης μνήμης για έναν πίνακα n ακεραίων.
A. Θεωρία
4. Δυναμική Δέσμευση Μνήμης για Πίνακες
2. Παράδειγμα δέσμευσης μνήμης για μονοδιάστατο πίνακα
24Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
/* CPP3.1d_dynamic_array Μονοδιάστατος
πίνακας με δυναμική δέσμευση μνήμης */
#include <iostream>
using namespace std;
int main()
{
int *arr;
int n=4;
/* Δέσμευση Μνήμης */
arr = new int [n];
if (!arr) cout<<"Error allocating memory!";
/* Κάποια δουλειά στον πίνακα */
for (int i=0; i<n; i++)
arr[i]=i*i;
for (int i=0; i<n; i++)
cout<<arr[i]<<" ";
/* Αποδέσμευση Μνήμης */
delete [] arr;
return 0;
}
A. Θεωρία
4. Δυναμική Δέσμευση Μνήμης για Πίνακες
3. Διδιάστατοι Πίνακες
25Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Ένας διδιάστατος ΜxN πίνακας π.χ. ακεραίων είναι:
• ένας πίνακας M δεικτών σε ακέραιο
• όπου κάθε δείκτης είναι ένας πίνακας από N ακεραίους
• Σχηματικά (π.χ. για M=7, N=6):
1 5 2 4 3 2
6 4 6 9 3 4
2 5 9 4 6 2
1 8 9 6 2 3
9 1 5 1 6 7
9 8 4 1 3 5
1 9 7 6 4 2pin[6]
pin[1]
pin[2]
pin[3]
pin[4]
pin[5]
pin[0]
pin
pin[0][4]
pin[3][3]
pin[6][0]
M=7
γραμμές
Ν=6
στήλες
A. Θεωρία
4. Δυναμική Δέσμευση Μνήμης για Πίνακες
3. Διδιάστατοι Πίνακες
26Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
• Από τα παραπάνω:
• Η δέσμευση μνήμης θα γίνει με τις εντολές:
• Προσοχή, ότι το ptr είναι διπλός δείκτης
• αφου θέλουμε να δείχνει στην διεύθυνση μιας μεταβλητής που είναι διεύθυνση
ενός τύπου.
• Συνεπώς θα δηλωθεί ως:
• H αποδέσμευση θα γίνει εντολές:
ptr = new type * [Μ];
for (i=0; i<M; i++)
ptr[i] = new type [N];
type **ptr;
for (i=0; i<M; i++)
delete [] ptr[i];
delete [] ptr;
• Βλέπουμε και ένα παράδειγμα δέσμευσης μνήμης για έναν πίνακα n ακεραίων.
A. Θεωρία
4. Δυναμική Δέσμευση Μνήμης για Πίνακες
4. Παράδειγμα δέσμευσης μνήμης για διδιάστατο πίνακα
27Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
/* CPP3.2d_dynamic_array Διδιάστατος πίνακας με
δυναμική δέσμευση μνήμης */
#include <iostream>
using namespace std;
int main()
{
int **arr;
int i,j, n=3, m=5;
/* Δέσμευση Μνήμης */
arr = new int * [n];
if (!arr) cout<<"Error allocating memory!";
for (i=0; i<n; i++)
{
arr[i] = new int [m];
if (!arr[i]) cout<<"Error allocating memory!";
}
/* Κάποια δουλειά στον πίνακα */
for (i=0; i<n; i++)
for (j=0; j<m; j++)
arr[i][j]=i*j;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
cout<<arr[i][j];
cout<<endl;
}
/* Αποδέσμευση Μνήμης */
for (i=0; i<n; i++)
delete [] arr[i];
delete [] arr;
return 0;
}
Β. Ασκήσεις
Άσκηση 1: Διπλοί Δείκτες
28Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
Για να πειραματιστούμε με τους δείκτες
• Δηλώστε μία ακέραια μεταβλητή x
• Τυπώστε την τιμή και τη διεύθυνσή της
• Δηλώστε έναν δείκτη σε ακέραιο p
• Θέστε τον να δείχνει στην x
• Τυπώστε την τιμή και τη διεύθυνση του
• Τυπώστε την τιμή του x, μέσω του p.
• Δηλώστε έναν δείκτη σε δείκτη σε ακέραιο, με όνομα pp
• Θέστε τον να δείχνει στον p
• Τυπώστε την τιμή και τη διεύθυνσή του
• Τυπώστε την τιμή του x, μέσω του pp.
• Τυπώστε την τιμή του p, μέσω του pp.
Β. Ασκήσεις
Άσκηση 2: Κλάση Δυναμικός Πίνακας
29Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες
Κατασκευάστε μία κλάση (ARRAY) που να περιτυλίσσει την έννοια του μονοδιάστατου πίνακα ως
εξής:
• Να έχει ως μέλη έναν δυναμικό πίνακα (δείκτης) ακεραίων, καθώς και τη διάσταση του πίνακα
• Ο κατασκευαστής να παίρνει ως όρισμα τη διάσταση του πίνακα και να δεσμεύει δυναμικά το
χώρο μνήμης που απαιτείται.
• Ο καταστροφέας να διαγράφει τη μνήμη που έχει δεσμευτεί δυναμικά.
• Να έχει accessors για ένα στοιχείο του πίνακα
• Να τυπώνουν μήνυμα λάθους, σε περίπτωση πρόσβασης εκτός των ορίων του πίνακα.
• Μία μέθοδο print που να τυπώνει τα στοιχείτα του πίνακα
Η συνάρτηση main
• Να κατασκευάζει έναν πίνακα της κλάσης με 10 θέσεις
• Να αρχικοποιεί τα στοιχεία του πίνακα, ώστε κάθε στοιχείο να έχει το τετράγωνο της
αντίστοιχης θέσης.
• Να τυπώνει τον πίνακα.
Ποιο πρόβλημα υπάρχει με την υλοποίηση; Πότε περιμένουμε ότι το πρόγραμμα αυτό θα έχει
πρόβλημα και θα «σκάσει» κατά το χρόνο εκτέλεσης;
1 sur 29

Recommandé

Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ par
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣΗ ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣDimitris Psounis
5.9K vues30 diapositives
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C par
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ CC++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ CDimitris Psounis
2.3K vues33 diapositives
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ par
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣΗ ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣDimitris Psounis
4.9K vues25 diapositives
Η Γλώσσα C - Μάθημα 1 par
Η Γλώσσα C - Μάθημα 1Η Γλώσσα C - Μάθημα 1
Η Γλώσσα C - Μάθημα 1Dimitris Psounis
15.1K vues23 diapositives
Η Γλώσσα C - Μάθημα 2 par
Η Γλώσσα C - Μάθημα 2Η Γλώσσα C - Μάθημα 2
Η Γλώσσα C - Μάθημα 2Dimitris Psounis
8.8K vues24 diapositives
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥ par
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥDimitris Psounis
12.9K vues48 diapositives

Contenu connexe

Tendances

ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 2 - ΑΝΑΖΗΤΗΣΗ ΣΤΟΙΧΕΙΟΥ ΣΕ ΠΙΝΑΚΑ par
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 2 - ΑΝΑΖΗΤΗΣΗ ΣΤΟΙΧΕΙΟΥ ΣΕ ΠΙΝΑΚΑ ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 2 - ΑΝΑΖΗΤΗΣΗ ΣΤΟΙΧΕΙΟΥ ΣΕ ΠΙΝΑΚΑ
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 2 - ΑΝΑΖΗΤΗΣΗ ΣΤΟΙΧΕΙΟΥ ΣΕ ΠΙΝΑΚΑ Dimitris Psounis
4.3K vues14 diapositives
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣ par
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣDimitris Psounis
17.5K vues26 diapositives
ΠΛΗ10.ΚΑΡΤΑ ΜΑΘΗΜΑ 1.1 par
ΠΛΗ10.ΚΑΡΤΑ ΜΑΘΗΜΑ 1.1ΠΛΗ10.ΚΑΡΤΑ ΜΑΘΗΜΑ 1.1
ΠΛΗ10.ΚΑΡΤΑ ΜΑΘΗΜΑ 1.1Dimitris Psounis
11.4K vues3 diapositives
Η Γλώσσα C - Μάθημα 3 par
Η Γλώσσα C - Μάθημα 3 Η Γλώσσα C - Μάθημα 3
Η Γλώσσα C - Μάθημα 3 Dimitris Psounis
7.3K vues29 diapositives
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2 par
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2 Dimitris Psounis
6.8K vues20 diapositives
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ par
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣDimitris Psounis
9.7K vues34 diapositives

Tendances(20)

ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 2 - ΑΝΑΖΗΤΗΣΗ ΣΤΟΙΧΕΙΟΥ ΣΕ ΠΙΝΑΚΑ par Dimitris Psounis
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 2 - ΑΝΑΖΗΤΗΣΗ ΣΤΟΙΧΕΙΟΥ ΣΕ ΠΙΝΑΚΑ ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 2 - ΑΝΑΖΗΤΗΣΗ ΣΤΟΙΧΕΙΟΥ ΣΕ ΠΙΝΑΚΑ
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 2 - ΑΝΑΖΗΤΗΣΗ ΣΤΟΙΧΕΙΟΥ ΣΕ ΠΙΝΑΚΑ
Dimitris Psounis4.3K vues
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣ par Dimitris Psounis
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣ
Dimitris Psounis17.5K vues
ΠΛΗ10.ΚΑΡΤΑ ΜΑΘΗΜΑ 1.1 par Dimitris Psounis
ΠΛΗ10.ΚΑΡΤΑ ΜΑΘΗΜΑ 1.1ΠΛΗ10.ΚΑΡΤΑ ΜΑΘΗΜΑ 1.1
ΠΛΗ10.ΚΑΡΤΑ ΜΑΘΗΜΑ 1.1
Dimitris Psounis11.4K vues
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2 par Dimitris Psounis
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 2
Dimitris Psounis6.8K vues
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ par Dimitris Psounis
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ
Dimitris Psounis9.7K vues
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ par Dimitris Psounis
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 3 par Dimitris Psounis
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 3ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 3
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 3
Dimitris Psounis5.6K vues
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 5 - ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ par Dimitris Psounis
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 5 - ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 5 - ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 5 - ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ
Dimitris Psounis15.3K vues
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝ par Dimitris Psounis
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 14 - ΕΜΒΕΛΕΙΑ ΜΕΤΑΒΛΗΤΩΝ
Dimitris Psounis4.2K vues
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 13 - ΔΟΜΕΣ par Dimitris Psounis
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 13 - ΔΟΜΕΣΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 13 - ΔΟΜΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 13 - ΔΟΜΕΣ
Dimitris Psounis7.7K vues
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 4 par Dimitris Psounis
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 4ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 4
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 4
Dimitris Psounis5.8K vues

Similaire à ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ

Advanced Notes on Pointers par
Advanced Notes on PointersAdvanced Notes on Pointers
Advanced Notes on Pointersjtsagata
16 vues142 diapositives
Python Κεφ. 1.4 Δομή Επανάληψης par
Python Κεφ. 1.4 Δομή ΕπανάληψηςPython Κεφ. 1.4 Δομή Επανάληψης
Python Κεφ. 1.4 Δομή ΕπανάληψηςΙωάννου Γιαννάκης
3.5K vues22 diapositives
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 par
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8Dimitris Psounis
3.2K vues20 diapositives
Stelios poulakakis daktylidis diploma thesis presentation par
Stelios poulakakis daktylidis diploma thesis presentationStelios poulakakis daktylidis diploma thesis presentation
Stelios poulakakis daktylidis diploma thesis presentationISSEL
237 vues30 diapositives
Python. 1 2 δομή ακολουθίας par
Python. 1 2 δομή ακολουθίαςPython. 1 2 δομή ακολουθίας
Python. 1 2 δομή ακολουθίαςΙωάννου Γιαννάκης
3.4K vues13 diapositives
ΠΛΗ31 ΜΑΘΗΜΑ 3.5 par
ΠΛΗ31 ΜΑΘΗΜΑ 3.5ΠΛΗ31 ΜΑΘΗΜΑ 3.5
ΠΛΗ31 ΜΑΘΗΜΑ 3.5Dimitris Psounis
4.7K vues21 diapositives

Similaire à ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ(20)

Advanced Notes on Pointers par jtsagata
Advanced Notes on PointersAdvanced Notes on Pointers
Advanced Notes on Pointers
jtsagata16 vues
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 par Dimitris Psounis
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8
Dimitris Psounis3.2K vues
Stelios poulakakis daktylidis diploma thesis presentation par ISSEL
Stelios poulakakis daktylidis diploma thesis presentationStelios poulakakis daktylidis diploma thesis presentation
Stelios poulakakis daktylidis diploma thesis presentation
ISSEL237 vues
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ par Dimitris Psounis
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ
ΑΕΠΠ ΚΕΦ 2 par educast
ΑΕΠΠ ΚΕΦ 2ΑΕΠΠ ΚΕΦ 2
ΑΕΠΠ ΚΕΦ 2
educast702 vues
Evangelos Papathomas: Semantic Code Search in Software Repositories using Neu... par Manos Tsardoulias
Evangelos Papathomas: Semantic Code Search in Software Repositories using Neu...Evangelos Papathomas: Semantic Code Search in Software Repositories using Neu...
Evangelos Papathomas: Semantic Code Search in Software Repositories using Neu...
Evangelos papathomas diploma thesis presentation par ISSEL
Evangelos papathomas diploma thesis presentationEvangelos papathomas diploma thesis presentation
Evangelos papathomas diploma thesis presentation
ISSEL190 vues
5.1 python γενικά - υπολογισμοί & μεταβλητές par Panagiotis Mastrapas
5.1 python γενικά - υπολογισμοί & μεταβλητές5.1 python γενικά - υπολογισμοί & μεταβλητές
5.1 python γενικά - υπολογισμοί & μεταβλητές
αναπαράσταση αλγορίθμων και δεδομένων par MariaProGr
αναπαράσταση αλγορίθμων και δεδομένωναναπαράσταση αλγορίθμων και δεδομένων
αναπαράσταση αλγορίθμων και δεδομένων
MariaProGr1.2K vues

Plus de Dimitris Psounis

Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ) par
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ)Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ)
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ)Dimitris Psounis
641 vues7 diapositives
ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ) par
ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ)ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ)
ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ)Dimitris Psounis
475 vues8 diapositives
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ) par
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ)Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ)
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ)Dimitris Psounis
3.8K vues8 diapositives
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p) par
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p)C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p)
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p)Dimitris Psounis
331 vues9 diapositives
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6 par
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6Dimitris Psounis
2.9K vues6 diapositives
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5 par
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5Dimitris Psounis
898 vues6 diapositives

Plus de Dimitris Psounis(20)

Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ) par Dimitris Psounis
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ)Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ)
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ (4διαφ)
Dimitris Psounis641 vues
ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ) par Dimitris Psounis
ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ)ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ)
ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ (4δ)
Dimitris Psounis475 vues
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ) par Dimitris Psounis
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ)Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ)
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ (4 διαφ)
Dimitris Psounis3.8K vues
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p) par Dimitris Psounis
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p)C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p)
C++ - ΜΑΘΗΜΑ 1 - ΕΙΣΑΓΩΓΗ ΚΑΙ ΣΧΕΣΗ ΜΕ ΤΗ C (4sl/p)
Dimitris Psounis331 vues
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6 par Dimitris Psounis
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 6
Dimitris Psounis2.9K vues
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5 par Dimitris Psounis
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5
ΠΛΗ20 ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ 5
Dimitris Psounis898 vues
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ) par Dimitris Psounis
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ)ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ)
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 (ΕΚΤΥΠΩΣΗ)
Dimitris Psounis2.5K vues
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2 par Dimitris Psounis
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.2
Dimitris Psounis2.5K vues
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ) par Dimitris Psounis
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ)ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ)
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 (ΕΚΤΥΠΩΣΗ)
Dimitris Psounis4.6K vues
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1 par Dimitris Psounis
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1
ΠΛΗ10 ΚΑΡΤΕΣ ΜΑΘΗΜΑΤΟΣ 2.1
Dimitris Psounis4.5K vues
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 par Dimitris Psounis
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7
Dimitris Psounis3.2K vues
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ) par Dimitris Psounis
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ)ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 8 (ΕΚΤΥΠΩΣΗ)
Dimitris Psounis2.2K vues
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ) par Dimitris Psounis
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ)ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 7 (ΕΚΤΥΠΩΣΗ)
Dimitris Psounis2.1K vues
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 par Dimitris Psounis
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6
Dimitris Psounis3.9K vues
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ) par Dimitris Psounis
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ)ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ)
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6 (ΕΚΤΥΠΩΣΗ)
Dimitris Psounis2.8K vues

Dernier

ΠΑΙΔΑΓΩΓΙΚΟ ΙΔΕΟΔΡΟΜΙΟ - ΤΕΥΧΟΣ 21ο.pdf par
ΠΑΙΔΑΓΩΓΙΚΟ ΙΔΕΟΔΡΟΜΙΟ - ΤΕΥΧΟΣ 21ο.pdfΠΑΙΔΑΓΩΓΙΚΟ ΙΔΕΟΔΡΟΜΙΟ - ΤΕΥΧΟΣ 21ο.pdf
ΠΑΙΔΑΓΩΓΙΚΟ ΙΔΕΟΔΡΟΜΙΟ - ΤΕΥΧΟΣ 21ο.pdfNikolaos Ziakas
6 vues144 diapositives
Παιδιά εθισμένα σε socialmedia, βιντεοπαιχνίδια. par
Παιδιά εθισμένα σε socialmedia, βιντεοπαιχνίδια.Παιδιά εθισμένα σε socialmedia, βιντεοπαιχνίδια.
Παιδιά εθισμένα σε socialmedia, βιντεοπαιχνίδια.ssuser43d27b
6 vues14 diapositives
ΟΔΗΓΙΕΣ ΚΑΤΑΘΕΣΗΣ ΑΠΟΓΡΑΦΗΣ-3-4 (1).pdf par
ΟΔΗΓΙΕΣ ΚΑΤΑΘΕΣΗΣ ΑΠΟΓΡΑΦΗΣ-3-4 (1).pdfΟΔΗΓΙΕΣ ΚΑΤΑΘΕΣΗΣ ΑΠΟΓΡΑΦΗΣ-3-4 (1).pdf
ΟΔΗΓΙΕΣ ΚΑΤΑΘΕΣΗΣ ΑΠΟΓΡΑΦΗΣ-3-4 (1).pdfssuser369a35
16 vues2 diapositives
Ο ΑΪ ΒΑΣΙΛΗΣ ΣΤΙΣ ΔΙΑΦΟΡΕΣ ΧΩΡΕΣ.pptx par
Ο ΑΪ ΒΑΣΙΛΗΣ ΣΤΙΣ ΔΙΑΦΟΡΕΣ ΧΩΡΕΣ.pptxΟ ΑΪ ΒΑΣΙΛΗΣ ΣΤΙΣ ΔΙΑΦΟΡΕΣ ΧΩΡΕΣ.pptx
Ο ΑΪ ΒΑΣΙΛΗΣ ΣΤΙΣ ΔΙΑΦΟΡΕΣ ΧΩΡΕΣ.pptxssuser86b52c
5 vues20 diapositives
Η δική μου Παναγιά par
Η δική μου ΠαναγιάΗ δική μου Παναγιά
Η δική μου Παναγιάhrisgiou
31 vues14 diapositives
ΠΡΟΓΡΑΜΜΑ_ΤΕΛΙΚΟ_01.12.2023.pdf par
ΠΡΟΓΡΑΜΜΑ_ΤΕΛΙΚΟ_01.12.2023.pdfΠΡΟΓΡΑΜΜΑ_ΤΕΛΙΚΟ_01.12.2023.pdf
ΠΡΟΓΡΑΜΜΑ_ΤΕΛΙΚΟ_01.12.2023.pdf2lykkomo
183 vues1 diapositive

Dernier(20)

ΠΑΙΔΑΓΩΓΙΚΟ ΙΔΕΟΔΡΟΜΙΟ - ΤΕΥΧΟΣ 21ο.pdf par Nikolaos Ziakas
ΠΑΙΔΑΓΩΓΙΚΟ ΙΔΕΟΔΡΟΜΙΟ - ΤΕΥΧΟΣ 21ο.pdfΠΑΙΔΑΓΩΓΙΚΟ ΙΔΕΟΔΡΟΜΙΟ - ΤΕΥΧΟΣ 21ο.pdf
ΠΑΙΔΑΓΩΓΙΚΟ ΙΔΕΟΔΡΟΜΙΟ - ΤΕΥΧΟΣ 21ο.pdf
Παιδιά εθισμένα σε socialmedia, βιντεοπαιχνίδια. par ssuser43d27b
Παιδιά εθισμένα σε socialmedia, βιντεοπαιχνίδια.Παιδιά εθισμένα σε socialmedia, βιντεοπαιχνίδια.
Παιδιά εθισμένα σε socialmedia, βιντεοπαιχνίδια.
ssuser43d27b6 vues
ΟΔΗΓΙΕΣ ΚΑΤΑΘΕΣΗΣ ΑΠΟΓΡΑΦΗΣ-3-4 (1).pdf par ssuser369a35
ΟΔΗΓΙΕΣ ΚΑΤΑΘΕΣΗΣ ΑΠΟΓΡΑΦΗΣ-3-4 (1).pdfΟΔΗΓΙΕΣ ΚΑΤΑΘΕΣΗΣ ΑΠΟΓΡΑΦΗΣ-3-4 (1).pdf
ΟΔΗΓΙΕΣ ΚΑΤΑΘΕΣΗΣ ΑΠΟΓΡΑΦΗΣ-3-4 (1).pdf
ssuser369a3516 vues
Ο ΑΪ ΒΑΣΙΛΗΣ ΣΤΙΣ ΔΙΑΦΟΡΕΣ ΧΩΡΕΣ.pptx par ssuser86b52c
Ο ΑΪ ΒΑΣΙΛΗΣ ΣΤΙΣ ΔΙΑΦΟΡΕΣ ΧΩΡΕΣ.pptxΟ ΑΪ ΒΑΣΙΛΗΣ ΣΤΙΣ ΔΙΑΦΟΡΕΣ ΧΩΡΕΣ.pptx
Ο ΑΪ ΒΑΣΙΛΗΣ ΣΤΙΣ ΔΙΑΦΟΡΕΣ ΧΩΡΕΣ.pptx
ssuser86b52c5 vues
Η δική μου Παναγιά par hrisgiou
Η δική μου ΠαναγιάΗ δική μου Παναγιά
Η δική μου Παναγιά
hrisgiou 31 vues
ΠΡΟΓΡΑΜΜΑ_ΤΕΛΙΚΟ_01.12.2023.pdf par 2lykkomo
ΠΡΟΓΡΑΜΜΑ_ΤΕΛΙΚΟ_01.12.2023.pdfΠΡΟΓΡΑΜΜΑ_ΤΕΛΙΚΟ_01.12.2023.pdf
ΠΡΟΓΡΑΜΜΑ_ΤΕΛΙΚΟ_01.12.2023.pdf
2lykkomo183 vues
Από τον ηλεκτρισμό στον μαγνητισμό par Dimitra Mylonaki
Από τον ηλεκτρισμό στον μαγνητισμόΑπό τον ηλεκτρισμό στον μαγνητισμό
Από τον ηλεκτρισμό στον μαγνητισμό
ΧΡΙΣΤΟΥΓΕΝΝΑ 2 (1).pptx par ssuser86b52c
ΧΡΙΣΤΟΥΓΕΝΝΑ 2 (1).pptxΧΡΙΣΤΟΥΓΕΝΝΑ 2 (1).pptx
ΧΡΙΣΤΟΥΓΕΝΝΑ 2 (1).pptx
ssuser86b52c5 vues
Τριάντα εννιά καφενεία και ένα κουρείο par Dimitra Mylonaki
Τριάντα εννιά καφενεία και ένα κουρείοΤριάντα εννιά καφενεία και ένα κουρείο
Τριάντα εννιά καφενεία και ένα κουρείο
ΚΑΤΑΝΑΛΩΤΙΣΜΟΣ. par ssuser43d27b
ΚΑΤΑΝΑΛΩΤΙΣΜΟΣ.ΚΑΤΑΝΑΛΩΤΙΣΜΟΣ.
ΚΑΤΑΝΑΛΩΤΙΣΜΟΣ.
ssuser43d27b12 vues
2023_11_29_Φ_251_136798_Α5_ΕΓΚΥΚΛΙΟΣ_ΑΙΤΗΣΗΣ_ΔΗΛΩΣΗΣ_ΓΕΛ_2024.pdf par ssuser9e6212
2023_11_29_Φ_251_136798_Α5_ΕΓΚΥΚΛΙΟΣ_ΑΙΤΗΣΗΣ_ΔΗΛΩΣΗΣ_ΓΕΛ_2024.pdf2023_11_29_Φ_251_136798_Α5_ΕΓΚΥΚΛΙΟΣ_ΑΙΤΗΣΗΣ_ΔΗΛΩΣΗΣ_ΓΕΛ_2024.pdf
2023_11_29_Φ_251_136798_Α5_ΕΓΚΥΚΛΙΟΣ_ΑΙΤΗΣΗΣ_ΔΗΛΩΣΗΣ_ΓΕΛ_2024.pdf
ssuser9e6212405 vues
ΠΑΝΕΠΙΣΤΗΜΙΟ ΔΥΤΙΚΗΣ ΑΤΤΙΚΗΣ. par ssuser43d27b
ΠΑΝΕΠΙΣΤΗΜΙΟ ΔΥΤΙΚΗΣ ΑΤΤΙΚΗΣ.ΠΑΝΕΠΙΣΤΗΜΙΟ ΔΥΤΙΚΗΣ ΑΤΤΙΚΗΣ.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΔΥΤΙΚΗΣ ΑΤΤΙΚΗΣ.
ssuser43d27b7 vues

ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 3 - ΚΛΑΣΕΙΣ ΚΑΙ ΔΕΙΚΤΕΣ

  • 1. H ΓΛΩΣΣΑ C++ Μάθημα 3: Κλάσεις και Δείκτες Δημήτρης Ψούνης
  • 2. Περιεχόμενα Μαθήματος Α. Θεωρία 1. Διαχείριση Μνήμης 1. Στατική Δέσμευση Μνήμης 2. Στατική Δέσμευση Μνήμης για Συνήθεις Μεταβλητές 3. Στατική Δέσμευση Μνήμης για Αντικείμενα 2. Δυναμική Δέσμευση Μνήμης 1. Δείκτες (Υπενθύμιση από C) 2. Οι τελεστές new και delete 3. Δυναμική Δέσμευση για Συνήθεις Μεταβλητές 4. Δυναμική Δέσμευση για Αντικείμενα 5. Δυναμική Δέσμευση και Κατασκευαστές 2Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες 3. Κλάσεις που περιέχουν δείκτες 1. Παράδειγμα κλάσης που περιέχει δείκτες 2. …και ένα πρόβλημα (χωρίς λύση για την ώρα) 4. Δυναμική Δέσμευση Μνήμης για Πίνακες 1. Μονοδιάστατοι πίνακες 2. Παράδειγμα δέσμευσης μνήμης για μονοδιάστατους πίνακες 3. Διδιάστατοι πίνακες 4. Παράδειγμα δέσμευσης μνήμης για διδιάστατους πίνακες B. Ασκήσεις
  • 3. A. Θεωρία 1. Διαχείριση Μνήμης 1. Στατική και Δυναμική Δέσμευση Μνήμης 3Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Η διαχείριση μνήμης στη C++ γίνεται με παρόμοιο τρόπο με τη C. • Τα παρακάτω είναι εντελώς αντίστοιχα: • Στατική Δέσμευση Μνήμης: • Είναι γνωστός εκ των προτέρων ο χώρος μνήμης που απαιτείται για τα στιγμιότυπα. • Και έχει ήδη αποφασιστεί κατά το χρόνο μεταγλώττισης (π.χ. δηλώνουμε έναν πίνακα 10 θέσεων) • Οι τοπικές μεταβλητές αποθηκεύονται στον χώρο της συνάρτησης (στοίβα – stack) • Δυναμική Δέσμευση Μνήμης: • Δεν είναι γνωστός εκ των προτέρων ο χώρος μνήμης που πρέπει να δεσμεύσει το πρόγραμμά μας. • Αλλά αποφασίζεται κατά το χρόνο εκτέλεσης (π.χ. ο χρήστης αποφασίζει πόσες θέσεις θα έχει ένας πίνακας που χρησιμοποιεί το πρόγραμμα) • Ο χώρος μνήμης που δεσμεύεται δυναμικά είναι κοινός για όλες τις συναρτήσεις (σωρός – heap)
  • 4. A. Θεωρία 1. Διαχείριση Μνήμης 2. Στατική Δέσμευση μνήμης για συνήθεις μεταβλητές 4Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες /* CPP3.local_variables.cpp */ #include <iostream> using namespace std; void f() { int y=3; cout<<"inside f"; } int main() { int x=5; cout<<"inside main"; f(); return 0; } • Κάθε συνάρτηση έχει το δικό της χώρο μνήμης. • Κάθε τοπική μεταβλητή αποθηκεύεται στο χώρο μνήμης της συνάρτησης στην οποία ανήκει. • Σχηματικά, για το παράδειγμα: • Αυτός ο χώρος μνήμης καλείται και στοίβα (stack), λόγω του τρόπου με τον οποίο εχει υλοποιηθεί η κλήση των συναρτήσεων σε μία στοίβα: main f
  • 5. A. Θεωρία 1. Διαχείριση Μνήμης 3. Στατική Δέσμευση μνήμης για Αντικείμενα 5Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Ένα αντικείμενο αποθηκεύεται στη μνήμη ως εξής: • Τα μέλη του βρίσκονται σε διαδοχικές θέσεις μνήμης • Προσοχή, οι μέθοδοι βρίσκονται σε άλλο χώρο (είναι κοινές για όλα τα αντικείμενα της κλάσης) • Ο τελεστής sizeof μπορεί να χρησιμοποιήθεί για να μετρήσουμε το πλήθος των bytes που χρησιμοποιεί ένα αντικείμενο. • Παράδειγμα: /* CPP3.sizeof.cpp Μέγεθος αντικειμένου */ #include <iostream> using namespace std; class dummy { public: int x; int y; }; int main() { dummy ob; ob.x = 3; ob.y = 5; cout<<sizeof ob<<endl; return 0; } • Θα τυπώσει 8 (δύο ακέραιοι 4bytes ο καθένας) • Και η εικόνα της μνήμης:
  • 6. A. Θεωρία 2. Δυναμική Δέσμευση Μνήμης 1. Δείκτες (Υπενθύμιση από C) 6Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Ένας δείκτης είναι μια μεταβλητή που αποθηκεύει διευθύνσεις μεταβλητών • Ένας δείκτης δηλώνεται ως εξής: • Όπου ΤΔ είναι ένας οποιοσδήποτε τύπος δεδομένων (int, float, double κ.λπ.) • Π.χ. ένας δείκτης σε ακέραιο δηλώνεται με τη δήλωση: • Αποθηκεύουμε σε έναν δείκτη την διεύθυνση μιας μεταβλητής με τη δήλωση: • O τελεστής & επιστρέφει τη διεύθυνση της μεταβλητής στην οποία εφαρμόζεται. • Π.χ. αποθηκεύουμε στον δείκτη ptr τη διεύθυνση μιας μεταβλητής x με την εντολή: • και λέμε «ο δείκτης ptr δείχνει στην μεταβλητή x» ΤΔ *pointer_name; int *ptr; pointer_name = &variable; ptr = &x; • Αναλυτικά βλ. και «Γλώσσα C – Μάθημα 8: Δείκτες»
  • 7. A. Θεωρία 2. Δυναμική Δέσμευση Μνήμης 1. Δείκτες (Υπενθύμιση από C) 7Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες /* CPP3.pointers.cpp */ #include <iostream> using namespace std; int main() { int x=5; int *p = NULL; p = &x; cout<<"x = "<<x<<" (address: "<<&x<<")"<<endl; cout<<"*p = "<<*p<<" (address: "<<p<<")"<<endl; return 0; } • Το πρόγραμμα δείχνει την βασική ιδιότητα: • Για ένα δείκτη (p) που «δείχνει» σε μία μεταβλητη ισχύουν: • To NULL είναι μία ειδική τιμή • που συμβολίζει ότι ο δείκτης δεν δείχνει κάπου. • Είναι καλό ένας δείκτης που δεν δείχνει κάπου να έχει την τιμή NULL • H τιμη του NULL είναι 0. • Σχηματικά: p == &x //Διεύθυνση της x *p == x // Τιμή της x
  • 8. A. Θεωρία 2. Δυναμική Δέσμευση Μνήμης 2. Οι τελεστές new και delete 8Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Ο τελεστής new χρησιμοποιείται για να δεσμεύσει δυναμικά χώρο μνήμης • Αντικαθιστά τη malloc της C. • Η σύνταξη του είναι: • Δεσμεύει χώρο μνήμης για ένα αντικείμενου τύπου type και επιστρέφει έναν δείκτη σε αυτόν το χώρο • Ο χώρος μνήμης που δεσμεύεται δυναμικά, είναι κοινός για όλες τις συναρτήσεις και ονομάζεται σωρός (heap) • Προσοχή, αν αποτύχει η δέσμευση (δεν υπάρχει χώρος) επιστρέφει NULL • και θα πρέπει πάντα να ελέγχουμε ότι η δέσμευση έγινε επιτυχημένα ptr = new type; • Ο τελεστής delete χρησιμοποιείται για να απόδεσμευσει χώρο μνήμης που έχει δεσμευτεί δυναμικά • Αντικαθιστά τη free της C. • Η σύνταξη του είναι: delete ptr;
  • 9. A. Θεωρία 2. Δυναμική Δέσμευση Μνήμης 2. Οι τελεστές new και delete (Έλεγχος Δέσμευσης Μνήμης) 9Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Πάντα πρέπει να κάνουμε έλεγχο αν η μνήμη που αιτηθήκαμε με τη new, έχει όντως δεσμευτεί. • Βλέπουμε τρεις τρόπους για να «πιάσουμε» το πρόβλημα: • A’ τρόπος: Ο πιο απλός, μιας και απλά ελέγχουμε την επιστρεφόμενη τιμή: • Β’ τρόπος: Πιο ψαγμένος, ξέρουμε ότι το NULL είναι 0 (και για να είμαστε ακριβής (void *) 0) • Και ξέρουμε ότι το 0, είναι το λογικό ψευδές • και το !0 είναι το λογικό αληθές: • Γ’τρόπος: Ο πιο σύνθετος και φαντεζί, αλλά ενσωματώνει τις δύο εντολές σε μία γραμμή: • Στις σημειώσεις θα χρησιμοποιήσουμε κυρίως το Β’ τρόπο • Και θα βγάζουμε απλά ένα ενημερωτικό μήνυμα (αργότερα θα μπορούμε να κάνουμε και περισσότερα πράγματα, με τις εξαιρέσεις της C++) ptr = new type; if (ptr==NULL) { …. do some action… } ptr = new type; if (!ptr) { …. do some action… } if (!(ptr = new type)) { …. do some action… }
  • 10. A. Θεωρία 2. Δυναμική Δέσμευση Μνήμης 3. Δυναμική Δέσμευση για Συνήθεις Μεταβλητές 10Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Το παράδειγμα δείχνει τη δέσμευση μνήμης για έναν ακέραιο αριθμό, τόσο στατικά όσο και δυναμικά: #include <iostream> // CPP3.dynamic_variable.cpp using namespace std; int main() { int x; // Μεταβλητή που δεσμέυει στατικό χώρο int *p; // Δείκτης σε ακέραιο p = new int; // Δυναμική δέσμευση μνήμης if (!p) cout<<“Error allocating memory”; /* Αναθέσεις τιμών */ x = 1; *p = 5; /* Εκτυπώσεις */ cout<<"x = "<<x<<" (address: "<<&x<<")"<<endl; cout<<"*p = "<<*p<<" (address: "<<p<<")"<<endl; delete p; // Αποδέσμευση μνήμης return 0; } Υπενθυμίσεις από τη C: • Η x δεσμεύει χώρο μνήμης μέσα στο χώρο μνήμης της συνάρτησης • Ο χώρος που δεσμεύεται δυναμικά μέσω της p, είναι ένας ξεχωριστός χώρος, κοινός για όλο το πρόγραμμα • (λέγεται και σωρός – heap) • Σχηματικά:
  • 11. A. Θεωρία 2. Δυναμική Δέσμευση Μνήμης 4. Δυναμική Δέσμευση για Αντικείμενα 11Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες /* CPP3.dynamic_object.cpp Δυναμική Δέσμευση μνήμης για αντικείμενο */ #include <iostream> using namespace std; class dummy { public: int x; }; int main() { dummy *p = NULL; //Θα δείξει σε αντικείμενο p = new dummy; // Δέσμευση χώρου if (!p) cout<<“Error allocating memory”; /* Αναθέσεις τιμών */ p->x = 5; /* Εκτυπώσεις */ cout<<"p->x = "<<p->x<<endl; delete p; // Αποδέσμευση μνήμης return 0; } • Αντίστοιχα (αφού μία κλάση είναι τύπος δεδομένων), μπορεί να δεσμευτεί δυναμικά χώρος μνήμης για ένα αντικείμενο. • Όταν χρησιμοποιούμε ένα αντικείμενο μέσω δείκτη, • Έχουμε πρόσβαση στα δημόσια μέλη-μεθόδους μέσω του τελεστή -> (βελάκι) • Βλέπουμε και ένα παράδειγμα:
  • 12. A. Θεωρία 2. Δυναμική Δέσμευση Μνήμης 4. Δυναμική Δέσμευση για Αντικείμενα 12Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες /* CPP3.dereferencing.cpp */ #include <iostream> using namespace std; class dummy { public: int x; }; int main() { dummy *p = NULL; //Θα δείξει σε αντικείμενο p = new dummy; // Δέσμευση χώρου if (!p) cout<<“Error allocating memory”; /* Αναθέσεις τιμών */ (*p).x = 5; /* Εκτυπώσεις */ cout<<"(*p).x = "<<(*p).x<<endl; delete p; // Αποδέσμευση μνήμης return 0; } • Δεδομένου ενός δείκτη που δείχνει σε ένα αντικείμενο. • Με τον τελεστή *, έχουμε πρόσβαση στο ίδιο το αντικείμενο (dereferencing) • Και ισχύει ότι το (*p) είναι το αντικείμενο στο οποίο δείχνει ο δείκτης. • Συνεπώς έχουμε πρόσβαση στα δημόσια μέλη του (*p) με τον τελεστή . (τελεία) • Βλέπουμε και ένα παράδειγμα:
  • 13. A. Θεωρία 2. Δυναμική Δέσμευση Μνήμης 4. Δυναμική Δέσμευση για Αντικείμενα 13Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες /* CPP3.pointers_and_objects.cpp Δείκτης σε αντικείμενο */ #include <iostream> using namespace std; class dummy { public: int x; }; int main() { dummy ob; dummy *p = &ob; if (!p) cout<<“Error allocating memory”; /* Αναθέσεις τιμών */ ob.x = 6; /* Εκτυπώσεις */ cout<<ob.x<<" "<<p->x<<" "<<(*p).x<<endl; return 0; } • Και ένα ακόμη παράδειγμα, όπου βάζουμε ένα δείκτη να δείχνει σε ένα ήδη υφιστάμενο αντικείμενο: • Για να τονιστεί η διαφορά στην πρόσβαση, • απευθείας από το αντικείμενο (τελεστής .) • μέσω δείκτη (τελεστής ->) • μέσω dereferencing ( * και . )
  • 14. A. Θεωρία 2. Δυναμική Δέσμευση Μνήμης 5. Δυναμική Δέσμευση και κατασκευαστές 14Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Όταν δημιουργούμε ένα αντικείμενο με τον τελεστή new, • και εφόσον το αντικείμενο αυτό έχει κατασκευαστή • πρέπει να περάσουμε και τα ορίσματα στον κατασκευαστή • Ο κατασκευαστής καλείται όταν κάνουμε new • Ο καταστροφέας καλείται όταν κάνουμε delete /* CPP3.constructor_destru ctor.cpp */ #include <iostream> using namespace std; class dummy { public: dummy(int in_x); ~dummy(); private: int x; }; int main() { dummy *p = NULL; p = new dummy(5); //constructing if (!p) cout<<“Error allocating memory”; delete p; //destructing return 0; } dummy::dummy(int in_x) { x = in_x; cout<<"Constructing..."; } dummy::~dummy() { cout<<"Destructing..."; }
  • 15. A. Θεωρία 3. Κλάσεις που περιέχουν δείκτες 1. Παράδειγμα κλάσης που περιέχει δείκτη 15Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Ένας δείκτης είναι απλά μία μεταβλητή • Συνεπώς μπορεί να είναι μέλος σε κλάση • Βλέπουμε ένα απλό παράδειγμα: • Στο οποίο δεσμεύουμε δυναμικά στον κατασκευαστή το χώρο για έναν ακέραιο • και τον αποδεσμεύουμε στον καταστροφέα. /* CPP3.class_with_pointer */ #include <iostream> using namespace std; class dummy { public: dummy(); ~dummy(); void set_val(int in_val); int get_val(); private: int *p_val; };
  • 16. A. Θεωρία 3. Κλάσεις που περιέχουν δείκτες 1. Παράδειγμα κλάσης που περιέχει δείκτη 16Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες int main() { dummy ob; ob.set_val(3); cout<<endl<<ob.get_val()<<endl; return 0; } dummy::dummy() { p_val = new int; if (!p_val) cout<<"Error allocating memory"; cout<<"Constructing..."; } dummy::~dummy() { delete p_val; cout<<"Destructing..."; } void dummy::set_val(int in_val) { *p_val = in_val; } int dummy::get_val() { return *p_val; }
  • 17. A. Θεωρία 3. Κλάσεις που περιέχουν δείκτες 2. …και ένα πρόβλημα (χωρίς λύση για την ώρα) 17Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Ας δούμε και ένα πρόβλημα που μπορεί να προκύψει όταν μία κλάση περιέχει δείκτες που κάνουν δυναμική διαχείριση μνήμης • Το πρόβλημα αυτό προκύπτει όταν: • Έχουμε μία κλάση που κάνει δυναμική δέσμευση μνήμης • Κάνουμε αντιγραφή του αντικειμένου (π.χ. ob1 = ob2) • Μεταγλωττίστε και εκτελέστε το ακόλουθο πρόγραμμα: /* CPP3.assignment_problem Δυναμική Δέσμευση και Τελεστής Ανάθεσης */ #include <iostream> using namespace std; class dummy { public: dummy(); ~dummy(); void set_val(int in_val); int get_val(); private: int *p_val; };
  • 18. A. Θεωρία 3. Κλάσεις που περιέχουν δείκτες 2. …και ένα πρόβλημα (χωρίς λύση για την ώρα) 18Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες int main() { dummy ob1; ob1.set_val(3); dummy ob2; ob2 = ob1; cout<<ob1.get_val()<<endl; cout<<ob2.get_val()<<endl; return 0; } dummy::dummy() { p_val = new int; if (!p_val) cout<<"Error allocating memory"; cout<<"Constructing..."; } dummy::~dummy() { delete p_val; cout<<"Destructing..."; } void dummy::set_val(int in_val) { *p_val = in_val; } int dummy::get_val() { return *p_val; } • Σημαντικό! Στη C++ οι μεταβλητές μπορούν να δηλωθούν σε οποιοδήποτε μέρος του προγράμματος (αλλά θα το αποφεύγουμε…)
  • 19. A. Θεωρία 3. Κλάσεις που περιέχουν δείκτες 2. …και ένα πρόβλημα (χωρίς λύση για την ώρα) 19Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • H εκτέλεση του προγράμματος οδηγεί σε σφάλμα κατά το χρόνο εκτέλεσης: • Για να καταλάβουμε γιατί συμβαίνει αυτό, θα δούμε την κατάσταση της μνήμης βήμα – βήμα κατά την εκτέλεση της main
  • 20. A. Θεωρία 3. Κλάσεις που περιέχουν δείκτες 2. …και ένα πρόβλημα (χωρίς λύση για την ώρα) 20Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • dummy ob1; // Δεσμεύει το χώρο για το ob1. • ob1.set_val(3); // αποθηκεύει την τιμή 3 στο χώρο μνήμης
  • 21. A. Θεωρία 3. Κλάσεις που περιέχουν δείκτες 2. …και ένα πρόβλημα (χωρίς λύση για την ώρα) 21Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • dummy ob2; // Δεσμεύει το χώρο για το ob2. • ob2=ob1 // Δεν κάνει ακριβώς αυτό που θέλουμε…
  • 22. A. Θεωρία 3. Κλάσεις που περιέχουν δείκτες 2. …και ένα πρόβλημα (χωρίς λύση για την ώρα) 22Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Τώρα με την ολοκλήρωση του προγράμματος, θα τρέξουν οι δύο destructors. • Συνεπώς ο ίδιος χώρος μνήμης θα αποδεσμευτεί δύο φορές. • Και αυτό οδηγεί σε σφάλμα στο χρόνο εκτέλεσης. • Ενώ ισχύει ότι έχουμε κάνει και το βασικό λάθος • Με την ολοκλήρωση του προγράμματος, έχει ξεμείνει χώρος μνήμης, τον οποίο δεσμεύσαμε δυναμικά και δεν τον αποδεσμεύσαμε ποτέ (memory leak) • Το πρόβλημα αυτό προκύπτει όταν γίνεται bit by bit αντιγραφή αντικειμένων (shallow copy) • όπως στην περίπτωση που είδαμε, • αλλά και σε άλλες περιπτώσεις (π.χ. όταν περνάμε ένα αντικείμενο μέσω τιμής σε μία συνάρτηση) • Θα αντιμετωπίσουμε το πρόβλημα αυτό, στα επόμενα μαθήματα: • Θα μάθουμε τις αναφορές (references) • και μέσω αυτών θα ορίσουμε τον κατασκευαστή αντιγράφου (copy constructor) • επίσης θα μάθουμε την υπερφόρτωση του = • και θα ορίσουμε τι πρέπει να γίνεται όταν έχουμε ανάθεση αντικειμένου
  • 23. A. Θεωρία 4. Δυναμική Δέσμευση Μνήμης για Πίνακες 1. Μονοδιάστατοι Πίνακες 23Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Οι τελεστές new και delete χρησιμοποιούνται και για την δέσμευση μνήμης για πίνακες • Δέσμευση Μνήμης: • Η σύνταξη του τελεστή new είναι: • Δεσμεύει χώρο μνήμης για n αντικείμενα τύπου type και επιστρέφει έναν δείκτη σε αυτόν το χώρο • Το n δεν χρειάζεται να είναι σταθερά. • Αποδέσμευση Μνήμης: • Η σύνταξη του τελεστή delete είναι: ptr = new type [n]; delete [] ptr;
  • 24. • Βλέπουμε και ένα παράδειγμα δέσμευσης μνήμης για έναν πίνακα n ακεραίων. A. Θεωρία 4. Δυναμική Δέσμευση Μνήμης για Πίνακες 2. Παράδειγμα δέσμευσης μνήμης για μονοδιάστατο πίνακα 24Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες /* CPP3.1d_dynamic_array Μονοδιάστατος πίνακας με δυναμική δέσμευση μνήμης */ #include <iostream> using namespace std; int main() { int *arr; int n=4; /* Δέσμευση Μνήμης */ arr = new int [n]; if (!arr) cout<<"Error allocating memory!"; /* Κάποια δουλειά στον πίνακα */ for (int i=0; i<n; i++) arr[i]=i*i; for (int i=0; i<n; i++) cout<<arr[i]<<" "; /* Αποδέσμευση Μνήμης */ delete [] arr; return 0; }
  • 25. A. Θεωρία 4. Δυναμική Δέσμευση Μνήμης για Πίνακες 3. Διδιάστατοι Πίνακες 25Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Ένας διδιάστατος ΜxN πίνακας π.χ. ακεραίων είναι: • ένας πίνακας M δεικτών σε ακέραιο • όπου κάθε δείκτης είναι ένας πίνακας από N ακεραίους • Σχηματικά (π.χ. για M=7, N=6): 1 5 2 4 3 2 6 4 6 9 3 4 2 5 9 4 6 2 1 8 9 6 2 3 9 1 5 1 6 7 9 8 4 1 3 5 1 9 7 6 4 2pin[6] pin[1] pin[2] pin[3] pin[4] pin[5] pin[0] pin pin[0][4] pin[3][3] pin[6][0] M=7 γραμμές Ν=6 στήλες
  • 26. A. Θεωρία 4. Δυναμική Δέσμευση Μνήμης για Πίνακες 3. Διδιάστατοι Πίνακες 26Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες • Από τα παραπάνω: • Η δέσμευση μνήμης θα γίνει με τις εντολές: • Προσοχή, ότι το ptr είναι διπλός δείκτης • αφου θέλουμε να δείχνει στην διεύθυνση μιας μεταβλητής που είναι διεύθυνση ενός τύπου. • Συνεπώς θα δηλωθεί ως: • H αποδέσμευση θα γίνει εντολές: ptr = new type * [Μ]; for (i=0; i<M; i++) ptr[i] = new type [N]; type **ptr; for (i=0; i<M; i++) delete [] ptr[i]; delete [] ptr;
  • 27. • Βλέπουμε και ένα παράδειγμα δέσμευσης μνήμης για έναν πίνακα n ακεραίων. A. Θεωρία 4. Δυναμική Δέσμευση Μνήμης για Πίνακες 4. Παράδειγμα δέσμευσης μνήμης για διδιάστατο πίνακα 27Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες /* CPP3.2d_dynamic_array Διδιάστατος πίνακας με δυναμική δέσμευση μνήμης */ #include <iostream> using namespace std; int main() { int **arr; int i,j, n=3, m=5; /* Δέσμευση Μνήμης */ arr = new int * [n]; if (!arr) cout<<"Error allocating memory!"; for (i=0; i<n; i++) { arr[i] = new int [m]; if (!arr[i]) cout<<"Error allocating memory!"; } /* Κάποια δουλειά στον πίνακα */ for (i=0; i<n; i++) for (j=0; j<m; j++) arr[i][j]=i*j; for (i=0; i<n; i++) { for (j=0; j<m; j++) cout<<arr[i][j]; cout<<endl; } /* Αποδέσμευση Μνήμης */ for (i=0; i<n; i++) delete [] arr[i]; delete [] arr; return 0; }
  • 28. Β. Ασκήσεις Άσκηση 1: Διπλοί Δείκτες 28Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες Για να πειραματιστούμε με τους δείκτες • Δηλώστε μία ακέραια μεταβλητή x • Τυπώστε την τιμή και τη διεύθυνσή της • Δηλώστε έναν δείκτη σε ακέραιο p • Θέστε τον να δείχνει στην x • Τυπώστε την τιμή και τη διεύθυνση του • Τυπώστε την τιμή του x, μέσω του p. • Δηλώστε έναν δείκτη σε δείκτη σε ακέραιο, με όνομα pp • Θέστε τον να δείχνει στον p • Τυπώστε την τιμή και τη διεύθυνσή του • Τυπώστε την τιμή του x, μέσω του pp. • Τυπώστε την τιμή του p, μέσω του pp.
  • 29. Β. Ασκήσεις Άσκηση 2: Κλάση Δυναμικός Πίνακας 29Δημήτρης Ψούνης, Η Γλώσσα C++, Μάθημα 3: Κλάσεις και Δείκτες Κατασκευάστε μία κλάση (ARRAY) που να περιτυλίσσει την έννοια του μονοδιάστατου πίνακα ως εξής: • Να έχει ως μέλη έναν δυναμικό πίνακα (δείκτης) ακεραίων, καθώς και τη διάσταση του πίνακα • Ο κατασκευαστής να παίρνει ως όρισμα τη διάσταση του πίνακα και να δεσμεύει δυναμικά το χώρο μνήμης που απαιτείται. • Ο καταστροφέας να διαγράφει τη μνήμη που έχει δεσμευτεί δυναμικά. • Να έχει accessors για ένα στοιχείο του πίνακα • Να τυπώνουν μήνυμα λάθους, σε περίπτωση πρόσβασης εκτός των ορίων του πίνακα. • Μία μέθοδο print που να τυπώνει τα στοιχείτα του πίνακα Η συνάρτηση main • Να κατασκευάζει έναν πίνακα της κλάσης με 10 θέσεις • Να αρχικοποιεί τα στοιχεία του πίνακα, ώστε κάθε στοιχείο να έχει το τετράγωνο της αντίστοιχης θέσης. • Να τυπώνει τον πίνακα. Ποιο πρόβλημα υπάρχει με την υλοποίηση; Πότε περιμένουμε ότι το πρόγραμμα αυτό θα έχει πρόβλημα και θα «σκάσει» κατά το χρόνο εκτέλεσης;