στατική λέξη-κλειδί

Μερικές φορές θέλετε να ορίσετε ένα μέλος μιας κλάσης που θα χρησιμοποιείται ανεξάρτητα από όλα τα άλλα αντικείμενα αυτής της κλάσης. Κατά κανόνα, η πρόσβαση σε ένα μέλος κλάσης οργανώνεται μέσω ενός αντικειμένου αυτής της κλάσης, αλλά ταυτόχρονα, είναι δυνατή η δημιουργία ενός μέλους κλάσης για ανεξάρτητη χρήση χωρίς αναφορά σε μια συγκεκριμένη παρουσία του αντικειμένου. Για να δημιουργήσετε ένα τέτοιο μέλος κλάσης, αρκεί να αναφέρετε στην αρχή της δήλωσής του λέξη-κλειδίστατικός.

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

Για να χρησιμοποιήσετε ένα μέλος τύπου static εκτός της κλάσης, αρκεί να καθορίσετε το όνομα αυτής της κλάσης με τον τελεστή κουκκίδας. Αλλά δεν χρειάζεται να δημιουργήσετε ένα αντικείμενο για αυτό. Στην πραγματικότητα, ένα στατικό μέλος δεν είναι προσβάσιμο με αναφορά σε ένα αντικείμενο, αλλά με το όνομα της κλάσης του.

Οι μεταβλητές που δηλώνονται ως στατικές είναι ουσιαστικά καθολικές. Όταν τα αντικείμενα δηλώνονται στην κλάση τους, τότε ένα αντίγραφο μεταβλητή τύπουστατική δεν δημιουργείται. Αντίθετα, όλα τα στιγμιότυπα της κλάσης μοιράζονται την ίδια μεταβλητή τύπου static. Μια τέτοια μεταβλητή αρχικοποιείται πριν χρησιμοποιηθεί στην κλάση.

Ένα παράδειγμα χρήσης της στατικής λέξης-κλειδιού:

Χρήση του συστήματος. χρησιμοποιώντας System.Collections.Generic; χρησιμοποιώντας System.Linq; χρησιμοποιώντας System.Text; namespace ConsoleApplication1 ( class myCircle ( // 2 μέθοδοι που επιστρέφουν το εμβαδόν και το μήκος ενός κύκλου δημόσιο στατικό διπλό SqrCircle(int ακτίνα) ( επιστροφή Math.PI * ακτίνα * ακτίνα; ) public static double LongCircle(int ακτίνα) ( return 2 * Math.PI * radius; ) ) class Program ( static void Main(string args) ( int r = 10; // Κλήση μεθόδων από άλλη κλάση // χωρίς δημιουργία αντικειμένου αυτής της κλάσης Console.WriteLine("Area of ​​a κύκλος με ακτίνα (0) = (1 :#.##)",r,myCircle.SqrCircle(r)); Console.WriteLine("Το μήκος του κύκλου είναι (0:#.##)",myCircle. LongCircle(r)); Console.ReadLine(); ) ) )

Υπάρχουν ορισμένοι περιορισμοί στη χρήση μεθόδων στατικού τύπου:

    Μια μέθοδος τύπου static δεν πρέπει να έχει αυτήν την αναφορά, καθώς μια τέτοια μέθοδος δεν εκτελείται σε κανένα αντικείμενο

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

    Παρόμοιοι περιορισμοί ισχύουν για δεδομένα τύπου στατικού. Για μια μέθοδο στατικού τύπου, μόνο άλλα δεδομένα στατικού τύπου που ορίζονται στην κλάση της είναι άμεσα προσβάσιμα. Συγκεκριμένα, δεν μπορεί να λειτουργήσει σε μια μεταβλητή στιγμιότυπου της κλάσης του, αφού δεν έχει αντικείμενα με τα οποία θα μπορούσε να λειτουργήσει.

Στατικοί κατασκευαστές

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

Χρήση του συστήματος. χρησιμοποιώντας System.Collections.Generic; χρησιμοποιώντας System.Linq; χρησιμοποιώντας System.Text; namespace ConsoleApplication1 ( class MyClass ( public static int a; public int b; // Static constructor static MyClass() ( a = 10; ) // Regular constructor public MyClass() ( b = 12; ) ) class Program ( static void Main (string args) ( Console.WriteLine("Πρόσβαση σε μια παρουσία της κλάσης a: " + MyClass.a); MyClass obj = νέο MyClass(); Console.WriteLine ("Πρόσβαση σε μια παρουσία της κλάσης b: " + obj.b) ; Κονσόλα .ReadLine(); ) ) )

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

Στατικές τάξεις

Μια κλάση μπορεί να δηλωθεί ως στατική. Μια στατική κλάση έχει δύο κύριες ιδιότητες. Πρώτα, δημιουργήστε στατικά αντικείμενα κλάσης ειναι ΑΠΑΓΟΡΕΥΜΕΝΟ. Και δεύτερον, μια στατική κλάση πρέπει να περιέχει μόνο στατικά μέλη. Δημιουργείται μια στατική κλάση με την ακόλουθη φόρμα δήλωσης κλάσης, τροποποιημένη με τη στατική λέξη-κλειδί.

όνομα κλάσης στατικής κλάσης ( // ...

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

Σε αυτό το άρθρο, θα εξερευνήσουμε στατικές μεθόδους στην Java και θα συγκρίνουμε το Static και το Instance. Το κύριο πράγμα που πρέπει να θυμάστε είναι ότι εάν χρησιμοποιείτε τη στατική λέξη-κλειδί με οποιαδήποτε μέθοδο, ονομάζεται στατική μέθοδος.

Τι είναι οι στατικές μέθοδοι στην Java;

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

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

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

Κλάση SimpleStaticExample ( // Αυτή είναι μια στατική μέθοδος static void myMethod() ( System.out.println("myMethod"); ) public static void main(String args) ( /* Μπορείςδείτε ότι καλούμε αυτήν τη μέθοδο * χωρίς να δημιουργήσουμε κανένα αντικείμενο. */ myMethod(); ) )

Σύνταξη

public static void geek(Όνομα συμβολοσειράς) ( // κώδικας που θα εκτελεστεί....

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

Σημαντικά σημεία:

  • Μια στατική μέθοδος(ες) που σχετίζονται με την κλάση στην οποία βρίσκονται, δηλαδή θα αναφέρονται σε αυτήν ακόμη και αν δεν αποτελεί στιγμιότυπο της κλάσης, π.χ. ClassName.methodName(args).
  • Προορίζονται για μοιρασιάόλα τα αντικείμενα που δημιουργούνται από την ίδια κλάση.
  • Οι στατικές μέθοδοι δεν μπορούν να παρακαμφθούν.

Ένα παράδειγμα χρήσης στατικών μεθόδων στην Java:

Εισαγωγή java.io.*; class Flair( public static String FlairName = ""; public static void geek(String name) ( FlairName = name; ) ) class GFG ( public static void main (String args) ( Flair.flair ("vaibhav"); System.out .println(Flair.flairName); Flair obj = νέο Flair(); obj.flair("shadow"); System.out.println(obj.flairName); ) )

Συμπέρασμα:
vaibhav
σκιά

Οι στατικές μεταβλητές (στατικές) και οι τιμές τους (πρωτόγονες ή αναφορές) ορίζονται μέσα στην κλάση και αποθηκεύονται στο χώρο μνήμης PermGen.

Τι γίνεται αν μια στατική μεταβλητή αναφέρεται σε ένα αντικείμενο;

static int i = 1;
static Object obj = new Object();

Η πρώτη γραμμή είναι η τιμή που θα αποθηκευτεί στην ενότητα PermGen. Στη δεύτερη γραμμή, η αναφορά obj θα αποθηκευτεί στην ενότητα PermGen και το αντικείμενο στο οποίο αναφέρεται θα αποθηκευτεί στην ενότητα heap.

Πότε χρησιμοποιούνται;

  • Εάν έχετε κώδικα που μπορεί να κοινοποιηθεί από όλες τις παρουσίες της ίδιας κλάσης, βάλτε αυτό το κομμάτι κώδικα σε μια Στατική μέθοδο.
  • Πρώτα απ 'όλα, ρυθμίστε στατικά πεδία πρόσβασης για την τάξη.

Τι είναι μια μέθοδος παρουσίας Java;

Μέθοδος παρουσίασης Javaείναι τρόποι με τους οποίους μπορεί να δημιουργηθεί ένα αντικείμενο μιας κλάσης πριν κληθεί. Για να καλέσουμε μια μέθοδο παρουσίας, πρέπει να δημιουργήσουμε ένα αντικείμενο από την κατηγορία στην οποία ορίζεται.

Public void flair(Όνομα συμβολοσειράς) // κώδικας που θα (εκτελεσθεί... ) // τύπος επιστροφής μπορεί να είναι int, float String ή τύπος δεδομένων που ορίζεται από το χρήστη.

Οι παράμετροι (τα ορίσματα που τους διαβιβάστηκαν), καθώς και οι τοπικές τους μεταβλητές και η τιμή επιστροφής, κατανέμονται στη στοίβα.

Σημαντικά σημεία:

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

Μέθοδος παρουσίας ή στατική μέθοδος σε Java;

  • Η μέθοδος παρουσίας θα έχει άμεση πρόσβαση σε μεθόδους και μεταβλητές στιγμιότυπου.
  • Η μέθοδος παρουσίασης θα έχει απευθείας πρόσβαση σε στατικές μεταβλητές και στατικές μεθόδους.
  • Οι στατικές μέθοδοι θα έχουν άμεση πρόσβαση σε στατικές μεταβλητές και μεθόδους.
  • Οι στατικές μέθοδοι δεν μπορούν να έχουν άμεση πρόσβαση σε μεθόδους και μεταβλητές στιγμιότυπου. Και μια στατική μέθοδος δεν μπορεί να το χρησιμοποιήσει, αφού δεν υπάρχει περίπτωση να αναφερθεί το "αυτό".

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

Σε αυτήν την περίπτωση, δεν μπορούμε να έχουμε απευθείας πρόσβαση στο Anything::s_value από την main() επειδή αυτό το μέλος είναι ιδιωτικό. Συνήθως, τα ιδιωτικά μέλη μιας κλάσης έχουν πρόσβαση μέσω δημόσιων μεθόδων. Ενώ θα μπορούσαμε να δημιουργήσουμε μια κανονική μέθοδο για πρόσβαση στη s_value , τότε θα έπρεπε να δημιουργήσουμε ένα αντικείμενο αυτής της κλάσης για να χρησιμοποιήσουμε τη μέθοδο! Υπάρχει μια καλύτερη επιλογή: μπορούμε να κάνουμε τη μέθοδο στατική.

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

class Anything ( private: static int s_value; public: static int getValue() ( return s_value; ) // static method ); int Οτιδήποτε::s_value = 3; // ορισμός μιας μεταβλητής στατικού μέλους int main() ( std::cout<< Anything::getValue() << "\n"; }

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

Οι στατικές μέθοδοι δεν έχουν *αυτό το δείκτη

Οι στατικές μέθοδοι έχουν δύο ενδιαφέροντα χαρακτηριστικά. Πρώτον, επειδή οι στατικές μέθοδοι δεν συνδέονται με ένα αντικείμενο, δεν έχουν ! Αυτό είναι λογικό επειδή ο δείκτης *αυτός δείχνει πάντα το αντικείμενο στο οποίο δουλεύει η μέθοδος. Οι στατικές μέθοδοι ενδέχεται να μην λειτουργούν μέσω ενός αντικειμένου, επομένως ο *αυτός ο δείκτης δεν χρειάζεται.

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

Ένα ακόμη παράδειγμα

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

#περιλαμβάνω class IDGenerator ( private: static int s_nextID; // δήλωση μιας στατικής μεταβλητής μέλους public: static int getNextID(); // δήλωση στατικής μεθόδου ); // Ο ορισμός μιας μεταβλητής στατικού μέλους είναι εκτός του σώματος της κλάσης. Σημειώστε ότι δεν χρησιμοποιούμε τη στατική λέξη-κλειδί εδώ // Έναρξη δημιουργίας αναγνωριστικού σε 1 int IDGenerator::s_nextID = 1; // Ο ορισμός της στατικής μεθόδου βρίσκεται εκτός του σώματος της κλάσης. Σημειώστε ότι δεν χρησιμοποιούμε τη στατική int IDGenerator::getNextID() ( return s_nextID++; ) λέξη-κλειδί εδώ. int main() ( for (int count=0; count< 4; ++count) std::cout << "The next ID is: " << IDGenerator::getNextID() << "\n"; return 0; }

#περιλαμβάνω

classIDGenerator

ιδιωτικό:

static int s_nextID ; // δήλωση μιας μεταβλητής στατικού μέλους

δημόσιο :

static int getNextID(); // δήλωση στατικής μεθόδου

// Έναρξη δημιουργίας αναγνωριστικού από 1

int IDGenerator :: s_nextID = 1 ;

int IDGenerator :: getNextID () (επιστροφή s_nextID ++ ;)

int main()

για (int count = 0 ; count< 4 ; ++ count )

std::cout<< "The next ID is: " << IDGenerator :: getNextID () << "\n" ;

επιστροφή 0 ;

Το αποτέλεσμα της εκτέλεσης του παραπάνω προγράμματος είναι:

Το επόμενο ID είναι: 1
Το επόμενο ID είναι: 2
Το επόμενο ID είναι: 3
Το επόμενο ID είναι: 4

Σημειώστε ότι επειδή όλες οι μεταβλητές και οι συναρτήσεις αυτής της κλάσης είναι στατικές, δεν χρειάζεται να δημιουργήσουμε ένα αντικείμενο αυτής της κλάσης για να δουλέψουμε μαζί της! Μια στατική μεταβλητή μέλους χρησιμοποιείται για την αποθήκευση της τιμής του επόμενου αναγνωριστικού που θα του εκχωρηθεί και μια στατική μέθοδος χρησιμοποιείται για την επιστροφή του αναγνωριστικού και την αύξησή του.

Προειδοποίηση για μαθήματα με όλα τα στατικά μέλη

Να είστε προσεκτικοί όταν γράφετε τάξεις με όλα τα στατικά μέλη. Ενώ τέτοιες «καθαρά στατικές τάξεις» μπορεί να είναι χρήσιμες, έχουν επίσης τα μειονεκτήματά τους.

Πρώτον, δεδομένου ότι όλα τα στατικά μέλη δημιουργούνται μόνο μία φορά, δεν μπορούν να υπάρχουν πολλαπλά αντίγραφα μιας «καθαρά στατικής κλάσης» (χωρίς να κλωνοποιηθεί η κλάση και να μετονομαστεί αργότερα). Για παράδειγμα, εάν χρειαζόμαστε δύο ανεξάρτητα αντικείμενα της κλάσης IDGenerator, τότε αυτό δεν θα είναι δυνατό μέσω μιας κλάσης "καθαρά στατικής".

Η C++ δεν υποστηρίζει στατικούς κατασκευαστές

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

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

class Something ( public: static std::vector s_mychars; ) std:: vector Κάτι::s_mychars = ( "o", "a", "u", "i", "e" ); // ορίστε μια στατική μεταβλητή μέλους

τάξη Κάτι

δημόσιο :

static std :: διάνυσμα< char >s_mychars ;

std:: vector< char >Κάτι :: s_mychars = ( "o" , "a" , "u" , "i" , "e" ) ; // ορίστε μια στατική μεταβλητή μέλους

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

#περιλαμβάνω #περιλαμβάνω class Something ( private: static std::vector s_mychars; public: class _nested // ορίστε μια ένθετη κλάση με το όνομα _nested ( public: _nested() // _nested κατασκευαστής αρχικοποιεί τη μεταβλητή στατικού μέλους μας ( s_mychars.push_back("o"); s_mychars.push_back("a"); s_mychars.push_back ( "u"); s_mychars.push_back("i"); s_mychars.push_back("e"); ) ); // Στατική μέθοδος για την έξοδο s_mychars static void getSomething() ( for (auto const &element: s_mychars) std::cout<< element << " "; } private: static _nested s_initializer; // используем статический объект класса _nested для гарантии того, что конструктор _nested выполнится }; std::vectorΚάτι::s_mychars; // ορίζουμε τη στατική μας μεταβλητή μέλους Something::_nested Something::s_initializer; // ορίστε το στατικό μας s_initializer που θα καλέσει τον κατασκευαστή _nested για να προετοιμάσει το s_mychars int main() ( Something::getSomething(); return 0; )

#περιλαμβάνω

#περιλαμβάνω

τάξη Κάτι

ιδιωτικό:

static std :: διάνυσμα< char >s_mychars ;

δημόσιο :

class_neted // ορίστε μια ένθετη κλάση με το όνομα _nested

δημόσιο :

ένθετο() // Ο κατασκευαστής _nested αρχικοποιεί τη μεταβλητή στατικού μέλους μας

s_mychars . push_back("o");

s_mychars . push_back("a");

s_mychars . push_back("u");

s_mychars . push_back("i");

s_mychars . push_back("e");

Οι περισσότερες λέξεις-κλειδιά C++ σάς επιτρέπουν να κάνετε ένα πράγμα. Χρησιμοποιείτε το int για να δηλώσετε μια ακέραια μεταβλητή ή όταν μια συνάρτηση επιστρέφει μια ακέραια τιμή ή παίρνει έναν ακέραιο ως όρισμα. Χρησιμοποιείτε τον νέο τελεστή για να εκχωρήσετε μνήμη και τον τελεστή διαγραφής για να την ελευθερώσετε. Μπορείτε να χρησιμοποιήσετε το const για να υποδείξετε ότι η τιμή μιας μεταβλητής δεν μπορεί να αλλάξει. Κατά ειρωνικό τρόπο, η στατική λέξη-κλειδί, αν και σημαίνει «αμετάβλητη», έχει αρκετές (και προφανώς άσχετες) χρήσεις. Η στατική λέξη-κλειδί μπορεί να χρησιμοποιηθεί σε τρία κύρια περιβάλλοντα:

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

Η χρήση στατικής μέσα σε μια συνάρτηση είναι η πιο εύκολη. Σημαίνει απλώς ότι αφού έχει αρχικοποιηθεί μια μεταβλητή, παραμένει στη μνήμη μέχρι το τέλος του προγράμματος. Μπορείτε να το σκεφτείτε ως μια μεταβλητή που διατηρεί την τιμή της μέχρι να τελειώσει το πρόγραμμα. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε μια στατική μεταβλητή για να καταγράψετε τον αριθμό των φορών που έχει κληθεί μια συνάρτηση προσθέτοντας απλώς τις γραμμές static int count = 0. και μετράνε++; σε μια συνάρτηση. Εφόσον το count είναι μια στατική μεταβλητή, η γραμμή static int count = 0; θα εκτελεστεί μόνο μία φορά. Κάθε φορά που καλείται η συνάρτηση, το count θα έχει την τελευταία τιμή που της δίνεται.

Μπορείτε επίσης να χρησιμοποιήσετε στατική με αυτόν τον τρόπο για να αποτρέψετε την επανεκκίνηση της μεταβλητής μέσα στον βρόχο. Για παράδειγμα, στον παρακάτω κώδικα, η μεταβλητή number_of_times θα είναι ίση με 100, παρόλο που η γραμμή static int number_of_times = 0; βρίσκεται μέσα στον βρόχο, όπου υποτίθεται ότι εκτελείται κάθε φορά που το πρόγραμμα φτάνει στον βρόχο. Το κόλπο είναι ότι η στατική λέξη-κλειδί αποτρέπει την επανεκκίνηση της μεταβλητής. Ένα από τα πράγματα σχετικά με τη χρήση της στατικής λέξης-κλειδιού είναι ότι θέτει αυτόματα τη μεταβλητή στο μηδέν για εσάς - αλλά μην βασίζεστε σε αυτήν (καθιστά ασαφείς τις προθέσεις σας).

Για(int ix=0; ix< 10; ix++) { for(int iy = 0; iy < 10; iy++) { static int number_of_times = 0; number_of_times++; } }

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

Η δεύτερη χρήση του στατικού είναι μέσα σε έναν ορισμό κλάσης. Αν και οι περισσότερες μεταβλητές που δηλώνονται σε μια κλάση μπορεί να έχουν διαφορετική τιμή σε κάθε παρουσία της κλάσης, τα στατικά πεδία μιας κλάσης θα έχουν την ίδια τιμή για όλες τις παρουσίες αυτής της κλάσης και δεν είναι καν απαραίτητο να δημιουργηθεί μια παρουσία αυτής της κλάσης . Είναι χρήσιμο να σκεφτόμαστε ότι οι στατικές μεταβλητές κλάσης περιέχουν τις πληροφορίες που απαιτούνται για τη δημιουργία νέων αντικειμένων (για παράδειγμα, σε ένα εργοστάσιο κλάσης). Για παράδειγμα, εάν θέλετε να αριθμήσετε παρουσίες μιας κλάσης, μπορείτε να χρησιμοποιήσετε μια στατική μεταβλητή για να παρακολουθείτε τον τελευταίο αριθμό που χρησιμοποιήθηκε. Είναι σημαντικό να σημειωθεί ότι είναι καλή πρακτική όταν χρησιμοποιείτε στατικές μεταβλητές κλάσης να χρησιμοποιείτε class_name::x; , όχι instance_of_class.x; . Αυτό βοηθά να υπενθυμίσει στον προγραμματιστή ότι οι στατικές μεταβλητές δεν ανήκουν στην ίδια παρουσία κλάσης και ότι δεν χρειάζεται να δημιουργήσετε μια παρουσία αυτής της κλάσης. Όπως πιθανότατα έχετε παρατηρήσει μέχρι τώρα, μπορείτε να χρησιμοποιήσετε τον τελεστή εμβέλειας, :: , για να αποκτήσετε πρόσβαση στο στατικό όταν έχετε πρόσβαση σε αυτό μέσω του ονόματος της κλάσης.

Είναι σημαντικό να έχετε κατά νου, κατά τον εντοπισμό σφαλμάτων ή την εφαρμογή ενός προγράμματος χρησιμοποιώντας στατικά , ότι δεν μπορείτε να το αρχικοποιήσετε μέσα σε μια κλάση. Στην πραγματικότητα, εάν αποφασίσετε να γράψετε όλο τον κώδικα κλάσης σε ένα αρχείο κεφαλίδας, δεν θα μπορείτε καν να αρχικοποιήσετε μια στατική μεταβλητή μέσα στο αρχείο κεφαλίδας. κάντε το σε αρχείο .cpp. Επίσης, πρέπει να αρχικοποιήσετε τα στατικά μέλη της τάξης, διαφορετικά δεν θα είναι εντός πεδίου. (Η σύνταξη είναι λίγο περίεργη: πληκτρολογήστε class_name::static_variable = τιμή .)

Μπορείτε επίσης να έχετε στατικές συναρτήσεις κλάσης. Οι στατικές συναρτήσεις είναι συναρτήσεις που δεν απαιτούν παρουσία μιας κλάσης και καλούνται με τον ίδιο τρόπο, κατ' αναλογία με στατικές μεταβλητές, με το όνομα της κλάσης και όχι με το όνομα του αντικειμένου. Για παράδειγμα, a_class::static_function(); , όχι an_instance.function(); . Οι στατικές συναρτήσεις μπορούν να λειτουργήσουν μόνο σε στατικά μέλη μιας κλάσης, καθώς δεν αναφέρονται σε συγκεκριμένες περιπτώσεις της κλάσης. Οι στατικές συναρτήσεις μπορούν να χρησιμοποιηθούν για την αλλαγή στατικών μεταβλητών, την παρακολούθηση των τιμών τους - για παράδειγμα, μπορείτε να χρησιμοποιήσετε μια στατική συνάρτηση εάν επιλέξετε να χρησιμοποιήσετε έναν μετρητή για να δώσετε σε κάθε στιγμιότυπο κλάσης ένα μοναδικό αναγνωριστικό.

Για παράδειγμα, μπορείτε να χρησιμοποιήσετε τον ακόλουθο κώδικα:

Χρήστης κλάσης ( private: int id; static int next_id; public: static int next_user_id() ( next_id++; return next_id; ) // άλλες μέθοδοι για την κλάση χρήστη user() // class constructor ( id = user::next_id++; / / ή κλήση μεθόδου, id = user.next_user_id(); ) ); int user::next_id = 0;

Σημειώστε ότι πρέπει να συμπεριλάβετε τον τύπο της στατικής μεταβλητής όταν την ορίζετε!

χρήστης a_user;

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

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