Προδιαγραφές πρόσβασης C ++

C Access Specifiers



Στο C ++, μια κλάση είναι ένα σύνολο μεταβλητών και συναρτήσεων που έχουν ρυθμιστεί ώστε να λειτουργούν μαζί. Όταν δίνονται τιμές στις μεταβλητές της κλάσης, αποκτάται ένα αντικείμενο. Ένα αντικείμενο έχει τις ίδιες μεταβλητές και λειτουργίες με μια κλάση, αλλά αυτή τη φορά, οι μεταβλητές έχουν τιμές. Πολλά αντικείμενα μπορούν να δημιουργηθούν από μία τάξη. Ένα αντικείμενο διαφέρει από ένα άλλο αντικείμενο ανάλογα με το διαφορετικό σύνολο τιμών που εκχωρούνται στις μεταβλητές του άλλου αντικειμένου. Η δημιουργία ενός αντικειμένου από μια κλάση λέγεται ότι δημιουργεί το αντικείμενο. Ακόμα κι αν δύο διαφορετικά αντικείμενα έχουν τις ίδιες τιμές για τις μεταβλητές τους, αυτά τα αντικείμενα είναι διαφορετικές οντότητες, που προσδιορίζονται με διαφορετικά ονόματα στο πρόγραμμα. Οι μεταβλητές για ένα αντικείμενο και την αντίστοιχη κλάση του ονομάζονται μέλη δεδομένων. Οι συναρτήσεις ενός αντικειμένου και της αντίστοιχης κλάσης του ονομάζονται συναρτήσεις μελών. Τα μέλη δεδομένων και οι λειτουργίες μελών ονομάζονται μέλη.

Η λέξη πρόσβαση σημαίνει ανάγνωση ή αλλαγή της τιμής μιας μεταβλητής και σημαίνει επίσης χρήση μιας συνάρτησης. Οι προσδιοριστές πρόσβασης C ++ είναι οι λέξεις, ιδιωτικές, προστατευμένες και δημόσιες. Αποφασίζουν εάν ένα μέλος μπορεί να έχει πρόσβαση σε άλλα μέλη της κλάσης του ή εάν μια συνάρτηση ή τελεστής εκτός της κλάσης και που δεν ανήκει στην κλάση μπορεί να έχει πρόσβαση σε οποιοδήποτε μέλος της κλάσης. Αποφασίζουν επίσης εάν ένα μέλος μιας παράγωγης (παιδικής) τάξης μπορεί να έχει πρόσβαση σε ένα μέλος μιας γονικής τάξης.







Απαιτούνται βασικές γνώσεις C ++ για να κατανοήσετε αυτό το άρθρο και να δοκιμάσετε τον παρεχόμενο κώδικα.



Περιεχόμενο άρθρου

Οι Δημόσιοι και Ιδιωτικοί Προδιαγραφείς

Τάξη
Οποιοδήποτε μέλος μιας κλάσης μπορεί να έχει πρόσβαση σε οποιοδήποτε άλλο μέλος της ίδιας τάξης, ανεξάρτητα από το οποίο έχει την ετικέτα δημόσιο ή ιδιωτικό. Εξετάστε το ακόλουθο πρόγραμμα:



#περιλαμβάνω
χρησιμοποιώντας ονομαστικου χωρουώρες?

τάξηTheCla
{
ιδιωτικός:
intnum1?
intnum2?
δημόσιο:
TheCla(intn1,intn2)
{
num1=n1?num2=n2?
}
intμέθοδος()
{
ΕΠΙΣΤΡΟΦΗnum1?
}
}?

intκύριος()
{
TheCla obj(10,είκοσι)?
intΝο2=objμέθοδος()?
κόστος<<Νο2<<' n'?

// int no1 = obj.num1;

ΕΠΙΣΤΡΟΦΗ 0?
}

Η έξοδος είναι 10. Τα ιδιωτικά μέλη είναι num1 και num2. Τα δημόσια μέλη είναι TheCla () και μέθοδος (). Σημειώστε ότι το TheCla () είναι η συνάρτηση κατασκευής που αρχικοποιεί τις μεταβλητές που μας ενδιαφέρουν. Η περιοχή ενός προσδιοριστή πρόσβασης ξεκινά από την ετικέτα του έως το τέλος της περιγραφής της κλάσης (ορισμός) ή από την αρχή ενός άλλου καθοριστή πρόσβασης.





Στην κύρια συνάρτηση (), η πρώτη πρόταση είναι η άμεση ενεργοποίηση της συνάρτησης κατασκευαστή, η οποία αρχικοποιεί τα num1 και num2. Η επόμενη δήλωση καλεί το δημόσιο μέλος, μέθοδος (), της κλάσης.

Τώρα, στην περιγραφή της τάξης (ορισμός), η συνάρτηση δημόσιου μέλους, TheCla (), έχει πρόσβαση στα ιδιωτικά μέλη, num1 και num2. Επίσης, η λειτουργία δημόσιου μέλους, μέθοδος (), αποκτά πρόσβαση στο ιδιωτικό μέλος, αριθ. Οποιοδήποτε μέλος εντός περιγραφής τάξης μπορεί να έχει πρόσβαση σε οποιοδήποτε άλλο μέλος εντός της ίδιας περιγραφής τάξης. δεν έχει σημασία ποιο μέλος είναι ιδιωτικό ή δημόσιο.



Ωστόσο, μια συνάρτηση ή τελεστής που δεν έχει δηλωθεί στην περιγραφή της κλάσης και εκτός της περιγραφής της κλάσης μπορεί να έχει πρόσβαση μόνο σε δημόσια μέλη της κλάσης. Η συνάρτηση main (), για παράδειγμα, είναι μια συνάρτηση που δηλώνεται έξω από την περιγραφή της κλάσης. Έχει πρόσβαση μόνο στη μέθοδο () και στα δημόσια μέλη του TheCla (). Μέσα στην κύρια συνάρτηση (), η συνάρτηση TheCla () είναι obj (10, 20).

Μια εξωτερική συνάρτηση ή ένας εξωτερικός τελεστής, όπως η συνάρτηση main (), δεν μπορεί να έχει πρόσβαση σε κανένα από τα ιδιωτικά μέλη της κλάσης, όπως το num1 ή το num2. Αφαιρέστε τον δείκτη σχολίου, //, από την τελευταία-αλλά-μία πρόταση στην κύρια (). Εάν επιχειρήσετε να μεταγλωττίσετε το πρόγραμμα, σημειώστε ότι το πρόγραμμα δεν θα μεταγλωττιστεί, δίνοντας ένα μήνυμα σφάλματος.

Προεπιλεγμένος προσδιοριστής
Ο προεπιλεγμένος προσδιοριστής για μια κλάση είναι ιδιωτικός. Έτσι, η παραπάνω περιγραφή κλάσης είναι η ίδια με την ακόλουθη περιγραφή, ιδιωτική, αλλά χωρίς τον καθοριστή:

τάξηTheCla
{
intnum1?
intnum2?
δημόσιο:
TheCla(intn1,intn2)
{
num1=n1?num2=n2?
}
intμέθοδος()
{
ΕΠΙΣΤΡΟΦΗnum1?
}
}?

Σημείωση : η ετικέτα προσδιοριστή πρόσβασης ξεκινά με τον προσδιοριστή και στη συνέχεια ακολουθείται από άνω και κάτω τελεία.

Ο προστατευόμενος προδιαγραφέας

Μέσα σε μια περιγραφή κλάσης και από εξωτερική συνάρτηση ή εξωτερικό τελεστή, ο προστατευμένος προσδιοριστής είναι ο ίδιος με τον ιδιωτικό προσδιοριστή. Τώρα, αντικαταστήστε τον ιδιωτικό προσδιοριστή στο παραπάνω πρόγραμμα με τον προσδιοριστή, προστατεύστε και αφαιρέστε τον δείκτη σχολίου, //, από την τελευταία-αλλά-μία πρόταση στην κύρια () συνάρτηση. Εάν επιχειρήσετε να μεταγλωττίσετε το πρόγραμμα, σημειώστε ότι το πρόγραμμα δεν θα μεταγλωττιστεί, δίνοντας ένα μήνυμα σφάλματος.

Το ζήτημα του προστατευμένου προσδιοριστή προκύπτει όταν τα μέλη της παράγωγης (κληρονομικής) κλάσης πρέπει να έχουν πρόσβαση στα μέλη της βασικής (γονικής) κλάσης.

Δημόσια παράγωγη τάξη με Δημόσια Μέλη
Εξετάστε το ακόλουθο πρόγραμμα:

#περιλαμβάνω
χρησιμοποιώντας ονομαστικου χωρουώρες?

τάξηTheCla
{
δημόσιο:
intnum1= 10?
προστατεύονται:
intnum2= είκοσι?
ιδιωτικός:
intnum3= 30?
}?

τάξηChildCla: δημόσιοTheCla
{
δημόσιο:
intμέθοδος 1()
{
ΕΠΙΣΤΡΟΦΗnum1?
}
intμέθοδος2()
{
ΕΠΙΣΤΡΟΦΗnum2?
}
/*int μέθοδος3 ()
{
επιστροφή num3?
} * /

}?

intκύριος()
{
ChildCla childObj?
intΝο1=παιδίObj.μέθοδος 1()?
κόστος<<Νο1<<' n'?

intΝο2=παιδίObj.μέθοδος2()?
κόστος<<Νο2<<' n'?

ΕΠΙΣΤΡΟΦΗ 0?
}

Η έξοδος είναι:
10
είκοσι

Στη βασική κλάση, το num1 είναι δημόσιο, το num2 προστατεύεται και το num3 είναι ιδιωτικό. Στην κλάση που παράγεται, όλες οι συναρτήσεις μελών είναι δημόσιες. Η πρώτη συνάρτηση, method1 (), έχει πρόσβαση στα μέλη δημόσιων δεδομένων, num1. Η δεύτερη συνάρτηση, Method2 (), έχει πρόσβαση στο προστατευόμενο μέλος δεδομένων, num2. Η τρίτη συνάρτηση, η μέθοδος3 (), αν και έχει σχολιαστεί αυτήν τη στιγμή, θα πρέπει να έχει πρόσβαση στο ιδιωτικό μέλος δεδομένων, num3.

Μια παράγωγη κλάση δεν δηλώνεται χωρίς προσδιοριστή πρόσβασης (δημόσια, προστατευμένη ή ιδιωτική). Πάνω, η παράγωγη κλάση δηλώνεται με τον δημόσιο προσδιοριστή, δηλαδή:

τάξηChildCla: δημόσιοTheCla{}

Τώρα καταργήστε το σχολιασμό του ορισμού της συνάρτησης τρίτου μέλους στην παράγωγη κλάση. Εάν επιχειρήσετε να μεταγλωττίσετε το πρόγραμμα, σημειώστε ότι δεν θα μεταγλωττιστεί, δίνοντας ένα μήνυμα σφάλματος.

Σημείωση : Όταν ολόκληρη η παράγωγη κλάση δηλώνεται δημόσια, τα μέλη της δεν μπορούν να έχουν πρόσβαση στα ιδιωτικά μέλη της βασικής κλάσης. Τα μέλη του μπορούν, ωστόσο, να έχουν πρόσβαση στα δημόσια και προστατευμένα μέλη της βασικής κλάσης. Το παραπάνω πρόγραμμα το αποδεικνύει.

Ωστόσο, σημειώστε ότι ένα δημόσιο μέλος της δημόσιας κλάσης μπορεί να έχει πρόσβαση σε ένα προστατευόμενο μέλος της βασικής κλάσης.

Παράγωγοι προδιαγραφείς κατηγορίας και προσδιοριστές μελών

Προστατευόμενη Παράγωγη Τάξη με Δημόσια Μέλη
Αντικαταστήστε τον δημόσιο προσδιοριστή με προστατευμένο στη δήλωση της ανωτέρω κατηγορίας, ως εξής:

τάξηChildCla: προστατεύονταιTheCla{}

Μεταγλωττίστε και εκτελέστε το πρόγραμμα και σημειώστε ότι το αποτέλεσμα είναι το ίδιο με πριν.

Έτσι, όταν ολόκληρη η παράγωγη κλάση δηλώνεται προστατευμένη, τα μέλη της δεν μπορούν να έχουν πρόσβαση στα ιδιωτικά μέλη της βασικής κλάσης. Τα μέλη του μπορούν, ωστόσο, να έχουν πρόσβαση στα δημόσια και προστατευμένα μέλη της βασικής κλάσης. Αυτό είναι το ίδιο όπως όταν η παράγωγη κλάση δηλώνεται δημόσια.

Σημείωση : ένα προστατευόμενο μέλος της δημόσιας κλάσης μπορεί να έχει πρόσβαση σε ένα προστατευόμενο μέλος της βασικής κλάσης.

Ιδιωτική Παράγωγη Τάξη με Δημόσια Μέλη
Αντικαταστήστε τον προστατευόμενο προσδιοριστή με ιδιωτικό στη δήλωση της παραπάνω κλάσης, ως εξής:

τάξηChildCla: ιδιωτικόςTheCla{}

Μεταγλωττίστε και εκτελέστε το πρόγραμμα και σημειώστε ότι το αποτέλεσμα είναι το ίδιο με πριν.

Έτσι, όταν ολόκληρη η παράγωγη κλάση δηλώνεται ιδιωτική, τα μέλη της δεν μπορούν να έχουν πρόσβαση στα ιδιωτικά μέλη της βασικής κλάσης. Τα μέλη του μπορούν, ωστόσο, να έχουν πρόσβαση στα δημόσια και προστατευμένα μέλη της βασικής κλάσης. Αυτό είναι το ίδιο όπως όταν η παράγωγη κλάση δηλώνεται προστατευμένη ή δημόσια.

Δημόσια παράγωγη τάξη με προστατευμένα μέλη
Πληκτρολογήστε, μεταγλωττίστε και εκτελέστε το ακόλουθο πρόγραμμα, στο οποίο προστατεύεται ολόκληρη η παράγωγη κλάση και προστατεύονται επίσης τα μέλη της. Ορισμένα τμήματα κώδικα είναι τα εξής:

#περιλαμβάνω
χρησιμοποιώντας ονομαστικου χωρουώρες?

τάξηTheCla
{
δημόσιο:
intnum1= 10?
προστατεύονται:
intnum2= είκοσι?
ιδιωτικός:
intnum3= 30?
}?

τάξηChildCla: δημόσιοTheCla
{
προστατεύονται:
intμέθοδος 1()
{
ΕΠΙΣΤΡΟΦΗnum1?
}
intμέθοδος2()
{
ΕΠΙΣΤΡΟΦΗnum2?
}
/*int μέθοδος3 ()
{
επιστροφή num3?
} * /

}?

intκύριος()
{
/*ChildCla childObj;
int no1 = childObj.method1 ();
κόστος<
/*int no2 = childObj.method2 ();
κόστος<
ΕΠΙΣΤΡΟΦΗ 0?
}

Το πρόγραμμα λειτουργεί όπως είναι. Δεν υπάρχει έξοδος και δεν υποτίθεται ότι υπάρχει έξοδος, με βάση τον τρόπο πληκτρολόγησης του προγράμματος.

Τώρα, καταργήστε το σχολιασμό του ορισμού της συνάρτησης, Method3 (), στην παράγωγη κλάση. Εάν επιχειρήσετε να μεταγλωττίσετε το πρόγραμμα, σημειώστε ότι δεν θα μεταγλωττιστεί, δίνοντας ένα μήνυμα σφάλματος. Αυτό σημαίνει ότι δεν είναι δυνατή η πρόσβαση σε ιδιωτικό μέλος από εξωτερική συνάρτηση, εξωτερικό τελεστή ή παράγωγη κλάση. Αυτό είναι το ίδιο συμπέρασμα που καταλήξαμε παραπάνω, σχετικά με την πρόσβαση σε ιδιωτικό μέλος.

Σημείωση : ένα προστατευόμενο μέλος της προστατευόμενης παράγωγης κλάσης μπορεί να έχει πρόσβαση σε ένα προστατευόμενο μέλος της βασικής κλάσης.

Τώρα, τοποθετήστε τα σχόλια πίσω στην παράγωγη κλάση και καταργήστε το σχολιασμό του πρώτου τμήματος κώδικα στην κύρια συνάρτηση (). Εάν επιχειρήσετε να μεταγλωττίσετε το πρόγραμμα, σημειώστε ότι το πρόγραμμα δεν θα μεταγλωττιστεί λόγω του πρώτου τμήματος κώδικα στην κύρια () συνάρτηση. Αυτό το αποτέλεσμα δεν είναι νέο. Εκτός από την παράγωγη κλάση, εξωτερικές συναρτήσεις και εξωτερικούς τελεστές, τα προστατευόμενα και ιδιωτικά μέλη μιας (βασικής ή προερχόμενης) κατηγορίας είναι του ίδιου προσδιοριστή, ιδιωτικά. Η κύρια () συνάρτηση βλέπει το προστατευόμενο μέλος οποιασδήποτε κλάσης, είτε βασικής είτε προερχόμενης, από τον ίδιο προσδιοριστή, ιδιωτικό και απαγορεύεται η πρόσβαση σε αυτήν.

Εάν το δεύτερο τμήμα κώδικα της συνάρτησης main () δεν σχολιαστεί, θα ισχύει η ίδια εξήγηση. Δηλαδή, η κύρια () συνάρτηση δεν θα μπορεί να έχει πρόσβαση σε προστατευμένο ή ιδιωτικό μέλος της παράγωγης κλάσης ή της βασικής κλάσης. Αυτό είναι ανεξάρτητο από το αν ένα προστατευόμενο μέλος της παράγωγης κλάσης θα μπορούσε να έχει πρόσβαση σε ένα προστατευόμενο μέλος της βασικής κλάσης.

Προστατευόμενη παράγωγη τάξη με προστατευμένα μέλη
Αντικαταστήστε τον δημόσιο προσδιοριστή με προστατευμένο στη δήλωση της ανωτέρω κατηγορίας, ως εξής:

τάξηChildCla: προστατεύονταιTheCla{}

Επαναφέρετε το σχόλιο των τμημάτων κώδικα στην κύρια συνάρτηση (), εάν αυτό δεν έχει ήδη γίνει. Μεταγλωττίστε και εκτελέστε το πρόγραμμα και σημειώστε ότι το αποτέλεσμα είναι όπως πριν.

Ιδιωτική Παράγωγη Τάξη με Προστατευόμενα Μέλη
Αντικαταστήστε τον προστατευόμενο προσδιοριστή με ιδιωτικό στη δήλωση της παραπάνω κλάσης, ως εξής:

τάξηChildCla: ιδιωτικόςTheCla

Μεταγλωττίστε και εκτελέστε το πρόγραμμα και σημειώστε ότι το αποτέλεσμα θα είναι όπως πριν.

Δημόσια παράγωγη τάξη με ιδιωτικά μέλη
Αντικαταστήστε τον ιδιωτικό προσδιοριστή με δημόσιο στη δήλωση της παραπάνω κλάσης, ως εξής:

τάξηChildCla: δημόσιοTheCla{}

Κάντε τα μέλη της παράγωγης τάξης ιδιωτικά. Μεταγλωττίστε και εκτελέστε το πρόγραμμα. Το αποτέλεσμα δεν διαφέρει από την υπόθεση Public Derived Class with Protected Members.

Προστατευόμενη Παράγωγη Τάξη με Ιδιωτικά Μέλη
Αντικαταστήστε τον δημόσιο προσδιοριστή με προστατευμένο στη δήλωση της ανωτέρω κατηγορίας, ως εξής:

τάξηChildCla: προστατεύονταιTheCla{}

Μεταγλωττίστε και εκτελέστε το πρόγραμμα. Αυτό το αποτέλεσμα δεν διαφέρει από την περίπτωση της προστατευόμενης κατηγορίας με προστατευόμενα μέλη.

Ιδιωτική Παράγωγη Τάξη με Ιδιωτικά Μέλη
Αντικαταστήστε τον προστατευόμενο προσδιοριστή με ιδιωτικό στη δήλωση της παραπάνω κλάσης, ως εξής:

τάξηChildCla: ιδιωτικόςTheCla{}

Μεταγλωττίστε και εκτελέστε το πρόγραμμα. Αυτό το αποτέλεσμα δεν διαφέρει από την περίπτωση Private Derived Class with Protected Members.

συμπέρασμα

Οι προσδιοριστές πρόσβασης C ++ είναι οι λέξεις ιδιωτικές, προστατευμένες και δημόσιες. Αποφασίζουν την πρόσβαση για τα μέλη μιας τάξης. Η περιοχή ενός προσδιοριστή πρόσβασης ξεκινά από την ετικέτα του, στο τέλος της περιγραφής της κλάσης (ορισμός) ή στην αρχή ενός άλλου καθοριστή πρόσβασης. Κάθε μέλος μιας τάξης μπορεί να έχει πρόσβαση σε οποιοδήποτε άλλο μέλος της ίδιας τάξης. Δεν είναι δυνατή η πρόσβαση σε ιδιωτικό μέλος μιας κλάσης από οποιαδήποτε εξωτερική συνάρτηση, οποιονδήποτε εξωτερικό τελεστή ή μια παράγωγη κλάση.

Το μέλος της βασικής κλάσης πρέπει να προστατεύεται έτσι ώστε να έχει πρόσβαση σε ένα ιδιωτικό μέλος της βασικής κλάσης ένα μέλος της παράγωγης κλάσης. Αυτό το προστατευμένο μέλος της βασικής κλάσης θεωρείται ως ιδιωτικό μέλος της βασικής κλάσης από μια εξωτερική συνάρτηση ή έναν εξωτερικό τελεστή.

Ένα δημόσιο μέλος μιας κλάσης μπορεί να έχει πρόσβαση από οποιαδήποτε εξωτερική συνάρτηση, οποιονδήποτε εξωτερικό τελεστή ή μια παράγωγη κλάση.

Ελλείψει οποιουδήποτε προσδιοριστή πρόσβασης σε μια κλάση, θεωρείται ο ιδιωτικός προσδιοριστής. Δηλαδή, ο προεπιλεγμένος προσδιοριστής πρόσβασης είναι ιδιωτικός.

Αναφορές που χρησιμοποιούνται σε αυτήν την εργασία