Hvad betyder statisk, når man beskriver et felt. Statiske klassemedlemmer

Klassemedlemmer kan bruges med det statiske nøgleord. I denne sammenhæng svarer dens betydning til den, den har i C. Når et klassemedlem er erklæret som statisk, bliver compileren derved instrueret i, at der kun skal eksistere én kopi af det pågældende medlem, uanset hvor mange objekter af den klasse, der oprettes. . Et statisk medlem deles af alle objekter i en given klasse. Alle statiske data initialiseres til nul, når det første objekt oprettes, og der er ingen anden initialisering.

Når du erklærer et statisk datamedlem af en klasse, er medlemmet ikke defineret. I stedet skal du give en global definition for dem uden for klassen. Dette gøres ved at generklære den statiske variabel ved at bruge scope-operatoren til at identificere den klasse, som variablen tilhører. Dette er nødvendigt, så hukommelse er allokeret til den statiske variabel.

Som et eksempel kan du overveje følgende program:

#omfatte
klassetæller (
statisk int count;
offentlig:
void setcount(int i) (count = i;);
void showcount()(cout<< count << " "; }
};
int counter::count; // definition af tælle
int main() (
tæller a, b;
a.showcount(); // udsender 0
b.showcount(); // udsender 0
a.setcount(10); // indstiller statisk tæller til 10
a.showcount(); // udskriver 10
b.showcount(); // udsender også 10
returnere 0;
}

Først og fremmest, lad os være opmærksomme på, at den statiske variabel af heltalstypen optælling er deklareret to steder: i tællerklassen og derefter som en global variabel. Borland C++ initialiserer tælling til nul. Dette er grunden til, at det første kald til showcount() returnerer nul. Objekt a sætter derefter count til 10. Objekter a og b udsender derefter begge den samme værdi, 10, ved hjælp af showcount()-funktionen Da der kun er én kopi af count, der deles af objekter a og b, er output i begge tilfælde værdien er 10.

Det er også muligt at have statiske medlemsfunktioner. Statiske medlemsfunktioner kan ikke direkte referere til ikke-statiske data eller ikke-statiske funktioner, der er erklæret i deres klasse. Grunden til dette er, at der ikke er denne pointer for dem, så der er ingen måde at vide, hvilke ikke-statiske data der skal arbejdes med. For eksempel, hvis der er to objekter i en klasse, der indeholder en statisk funktion f(), og hvis f() forsøger at få adgang til en ikke-statisk variabel var defineret af den pågældende klasse, hvordan kan man så bestemme, hvilken kopi af var der skal være brugt? Compileren kan ikke løse et sådant problem. Dette er grunden til, at statiske funktioner kun kan få adgang til andre statiske funktioner eller statiske data. Statiske funktioner kan heller ikke være virtuelle eller erklæres med const eller flygtige modifikatorer. En statisk funktion kan kaldes enten ved hjælp af et klasseobjekt eller ved at bruge klassenavnet og en scope-operator. Vi må dog ikke glemme, at selv når du kalder en statisk funktion ved hjælp af et objekt, sendes den ikke denne pointer.

Det følgende korte program illustrerer en af ​​de mange måder at bruge statiske funktioner på. En ret almindelig situation er, når du skal give adgang til en begrænset ressource, såsom en delt fil på et netværk. Som dette program illustrerer, giver brugen af ​​statiske data og funktioner en metode, hvorved et objekt kan kontrollere status for en ressource og få adgang til den, hvis det er muligt.

#omfatte


klasse adgang (
statisk enum access_t acs;
// ...
offentlig:


{
returnere acs;
}
// ...
};

int main()
{
adgang til obj1, obj2;
access::set_access(låst); // opkald ved hjælp af klassenavn
// ... kode

if (obj2.get_access()==ulåst) ( // kalder ved hjælp af objekt

cout<< "Access resource.\n";
}
andet cout<< "Locked out.\n";
// ...
returnere 0;
}

Når du kører dette program, vises "låst ude" på skærmen. Bemærk, at funktionen set_access() kaldes med klassenavnet og scope-operatoren. Get_access()-funktionen kaldes med et objekt og prikoperatoren. Når du kalder en statisk funktion, kan begge disse former bruges, og begge har samme effekt. Det er værd at eksperimentere lidt med dette program for at sikre, at du forstår, hvordan det fungerer.

Som nævnt har statiske funktioner kun direkte adgang til andre statiske funktioner eller statiske data inden for samme klasse. For at kontrollere dette, lad os prøve at kompilere følgende version af programmet:

// dette program indeholder en fejl og vil ikke kompilere
#omfatte
enum access_t (delt, i_brug, låst, ulåst);
// klasse kontrollerer sjælden ressource
klasse adgang (
statisk enum access_t acs;
int i; // ikke statisk
// ...
offentlig:
statisk void set_access (enum access_t a) (acs = a;)
statisk enum access_t get_access()
{
i = 100; // vil ikke kompilere
returnere acs;
}
// ...
};
enum access_t access::acs; // acs definition
int main()
{
adgang til obj1, obj2;
access::set_access(låst); // opkald ved hjælp af klassenavn
// ... kode
// kan obj2 få adgang til ressourcen
if(obj2.get_access()==ulåst) ( // kalder ved hjælp af objekt
adgang::set_adgang(i_brug); // opkald ved hjælp af klassenavn
cout<< "Access resource.\n";
}
andet cout<< "Locked out.\n";
// ...
}

Dette program vil ikke kompilere, fordi funktionen get_access() forsøger at få adgang til en ikke-statisk variabel.

I starten føler du måske ikke umiddelbart behov for at bruge statiske medlemmer, men efterhånden som du får mere erfaring med C++ programmering, bliver de meget nyttige i visse situationer, fordi de undgår brugen af ​​globale variabler.

Sidste opdatering: 25/12/2018

Ud over almindelige felter, metoder og egenskaber kan en klasse have statiske felter, metoder og egenskaber. Statiske felter, metoder, egenskaber gælder for hele klassen, og for at få adgang til sådanne klassemedlemmer er det ikke nødvendigt at oprette en forekomst af klassen. For eksempel:

Klassekonto ( offentlig statisk decimalbonus = 100; offentlig decimal totalsum; offentlig konto(decimalsum) ( totalSum = sum + bonus; ) ) klasse Program ( statisk void Main(streng args) ( Console.WriteLine(Account.bonus); / / 100 Konto.bonus += 200; Konto konto1 = ny konto(150 Konsol.Summe);

I dette tilfælde har kontoklassen to felter: bonus og totalSum. Bonusfeltet er statisk, så det gemmer klassens tilstand som helhed snarere end et individuelt objekt. Og så vi kan henvise til dette felt ved klassenavn:

Console.WriteLine(Konto.bonus); Account.bonus += 200;

På hukommelsesniveauet for statiske felter vil der blive oprettet en hukommelsesplacering, der vil være fælles for alle objekter i klassen.

I dette tilfælde tildeles hukommelse til statiske variabler, selvom der ikke oprettes nogen objekter af denne klasse.

Statiske egenskaber og metoder

På lignende måde kan vi skabe og bruge statiske metoder og egenskaber:

Klassekonto ( offentlig konto (decimalsum, decimalsats) ( if (sum< MinSum) throw new Exception("Недопустимая сумма!"); Sum = sum; Rate = rate; } private static decimal minSum = 100; // минимальная допустимая сумма для всех счетов public static decimal MinSum { get { return minSum; } set { if(value>0) minSum = værdi; ) ) offentlig decimal Sum ( get; privat sæt; ) // beløb på kontoen offentlig decimal Sats ( få; privat sæt; ) // rentesats // beregning af beløbet på kontoen efter en vis periode til en bestemt kurs offentlig statisk decimal GetSum(decimal sum , decimalsats, int periode) ( decimal resultat = sum; for (int i = 1; i<= period; i++) result = result + result * rate / 100; return result; } }

MinSum-variablen, MinSum-egenskaben og GetSum-metoden er defineret her med det statiske nøgleord, hvilket betyder, at de er statiske.

Variablen minSum og egenskaben MinSum repræsenterer det minimumsbeløb, der er tilladt for at oprette en faktura. Denne indikator gælder ikke for nogen specifik konto, men gælder for alle konti generelt. Hvis vi ændrer denne indikator for en konto, så skal den også ændre sig for den anden konto. Det vil sige, i modsætning til egenskaberne Sum og Rate, som gemmer et objekts tilstand, lagrer minSum-variablen tilstanden for alle objekter i en given klasse.

Det er det samme med GetSum-metoden – den beregner beløbet på kontoen efter en vis periode til en bestemt rente for et bestemt startbeløb. Kaldet og resultatet af denne metode afhænger ikke af et specifikt objekt eller dets tilstand.

Derfor bør variabler og egenskaber, der lagrer tilstand, der er fælles for alle objekter i en klasse, defineres som statiske. Og også metoder, der definerer adfærd, der er fælles for alle objekter, bør også erklæres som statiske.

Statiske medlemmer af en klasse er fælles for alle objekter i den klasse, så de skal henvises til med klassenavnet:

Bemærk, at statiske metoder kun kan få adgang til statiske medlemmer af en klasse. Vi kan ikke få adgang til ikke-statiske metoder, felter, egenskaber inde i en statisk metode.

Statiske felter bruges ofte til at opbevare tællere. Lad os f.eks. sige, at vi har en brugerklasse, og vi vil have en tæller, der fortæller os, hvor mange brugerobjekter, der er blevet oprettet:

Klassebruger ( private static int counter = 0; public User() ( counter++; ) public static void DisplayCounter() ( Console.WriteLine($"Created (counter) User objects"); ) ) klasse Program ( static void Main(string) args) (Bruger bruger1 = ny bruger(); Brugerbruger2 = ny bruger(); Brugerbruger3 = ny bruger(); Brugerbruger4 = ny bruger(); Brugerbruger5 = ny bruger(); User.DisplayCounter(); / / 5 Console.ReadKey();

Statisk konstruktør

Ud over almindelige konstruktører kan en klasse også have statiske konstruktører. Statiske konstruktører har følgende karakteristiske træk:

    Statiske konstruktører må ikke have en adgangsmodifikator og tager ikke parametre

    Som med statiske metoder kan statiske konstruktører ikke bruge dette nøgleord til at henvise til det aktuelle klasseobjekt og kan kun få adgang til statiske medlemmer af klassen

    Statiske konstruktører kan ikke kaldes manuelt i et program. De udføres automatisk, allerførste gang et objekt af en given klasse oprettes, eller første gang dets statiske medlemmer (hvis nogen) tilgås.

Statiske konstruktører bruges normalt til at initialisere statiske data eller udføre handlinger, der kun skal udføres én gang

Lad os definere en statisk konstruktør:

Klassebruger ( static User() ( Console.WriteLine("Den første bruger er oprettet"); ) ) klasse Program ( static void Main(string args) ( User user1 = new User(); // den statiske konstruktør vil fungere her Bruger bruger2 = ny Bruger();

Statiske klasser

Statiske klasser er deklareret med den statiske modifikator og kan kun indeholde statiske felter, egenskaber og metoder. For eksempel, hvis Account-klassen kun havde statiske variabler, egenskaber og metoder, kunne den erklæres som statisk:

Statisk klasse Konto ( privat statisk decimal minSum = 100; // det mindst tilladte beløb for alle konti offentlig statisk decimal MinSum ( get ( return minSum; ) sæt ( if(value>0) minSum = værdi; ) ) // tælle beløbet på kontoen efter en bestemt periode med en bestemt sats offentlig statisk decimal GetSum(decimal sum, decimalsats, int periode) ( decimal resultat = sum; for (int i = 1; i<= period; i++) result = result + result * rate / 100; return result; } }

I C# er et illustrativt eksempel på en statisk klasse Math-klassen, som bruges til forskellige matematiske operationer.

Sidste opdatering: 10/08/2017

Ud over variabler og metoder, der relaterer direkte til et objekt, giver C++ dig mulighed for at definere variabler og metoder, der relaterer direkte til en klasse eller på anden måde statiske medlemmer af en klasse. Statiske variabler og metoder gælder for hele klassen. Det statiske nøgleord bruges til at definere dem.

For eksempel kan en bank have mange forskellige indlån, men alle indlån vil have nogle fælles renter. Så for at beskrive en bankkonto definerer og bruger vi følgende klasse:

#omfatte klasse Konto ( offentlig: Konto(dobbeltsum) ( denne->sum = sum; ) static int getRate() ( return rate; ) static void setRate(int r) ( rate = r; ) double getIncome() ( return sum + sum * rate / 100 ) privat: dobbelt sum; int Account::rate = 8; int main() ( Kontokonto1(20000); Kontokonto2(50000); Konto::setRate(5); // nulstil satsværdien std::cout<< "Rate: " << Account::getRate() << std::endl; std::cout << "Rate: " << account1.getRate() << " Income: " << account1.getIncome() << std::endl; std::cout << "Rate: " << account2.getRate() << " Income: " << account2.getIncome() << std::endl; return 0; }

Kontoklassen definerer en statisk variabel sats og to statiske funktioner til at styre denne variabel. Når du definerer statiske funktioner, er det værd at overveje, at vi inde i dem kun kan bruge statiske klassevariable, såsom ratevariablen. Ikke-statiske variabler kan ikke bruges i statiske funktioner.

Derudover kan du ikke bruge denne pointer i statiske funktioner, hvilket i princippet er indlysende, da dette peger på det aktuelle objekt, og statiske funktioner refererer til hele klassen.

Det er også vigtigt, at hvis en klasse indeholder statiske variable, så skal de yderligere defineres uden for klassen:

Int Account::rate = 8;

Det er valgfrit at tildele en startværdi til en variabel.

Det er også værd at bemærke, at da statiske medlemmer refererer til hele klassen, bruges klassenavnet efterfulgt af ::-operatoren til at henvise til statiske medlemmer. Eller vi kan også få adgang til offentlige medlemmer af en klasse gennem variabler af den pågældende klasse:

Account::getRate() account1.getRate()

Konsoloutput af programmet:

Sats: 5 Sats: 5 Indkomst: 21000 Sats: 5 Indkomst: 52500

Det er også almindeligt at bruge statiske konstanter i klasser. Lad os for eksempel gøre satsvariablen i kontoklassen til en konstant:

#omfatte klasse Konto ( public: const static int rate = 8; Account(dobbeltsum) ( this->sum = sum; ) double getIncome() ( retursum + sum * rate / 100; ) privat: dobbeltsum; ); int main() ( Kontokonto1(20000); Kontokonto2(50000); std::cout<< "Rate: " << account1.rate << "\tIncome: " << account1.getIncome() << std::endl; std::cout << "Rate: " << account2.rate << "\tIncome: " << account2.getIncome() << std::endl; return 0; }

I modsætning til statiske variable behøver statiske konstanter ikke at blive defineret yderligere uden for klassen.

Nøgleord statisk

Nogle gange er du nødt til at definere et medlem af en klasse, der vil blive brugt uafhængigt af alle andre objekter i denne klasse. Typisk organiseres adgangen til et klassemedlem gennem et objekt af denne klasse, men samtidig kan du oprette et klassemedlem til uafhængig brug uden reference til en specifik forekomst af objektet. For at oprette et sådant klassemedlem er det nok at angive i begyndelsen af ​​sin erklæring statisk søgeord.

Hvis et klassemedlem erklæres som statisk, bliver det tilgængeligt, før nogen af ​​klassens objekter oprettes og uden en reference til noget objekt. Du kan erklære både variabler og metoder ved at bruge det statiske nøgleord. Det mest almindelige eksempel på et statisk medlem er Main()-metoden, der erklæres som sådan, fordi den skal kaldes af operativsystemet helt i starten af ​​det eksekverende program.

For at bruge et medlem af typen static uden for en klasse, er det nok at angive navnet på denne klasse med prikoperatoren. Men du behøver ikke oprette et objekt til dette. I virkeligheden er et medlem af typen static ikke tilgængeligt ved henvisning til et objekt, men ved navnet på dets klasse.

Variabler, der er erklæret som statiske, er i det væsentlige globale. Når objekter er erklæret i deres egen klasse, oprettes der ikke en kopi af en statisk variabel. I stedet deler alle forekomster af en klasse den samme statiske variabel. En sådan variabel initialiseres før den bruges i klassen.

Et eksempel på brug af det statiske søgeord:

Brug af System; ved hjælp af System.Collections.Generic; ved hjælp af System.Linq; ved hjælp af System.Text; navneområde ConsoleApplication1 ( class myCircle ( // 2 metoder, der returnerer arealet og længden af ​​en cirkel public static double SqrCircle(int radius) ( return Math.PI * radius * radius; ) public static double LongCircle(int radius) ( return 2 * Math.PI * radius ) ) klasse Program ( statisk void Main(string args) ( int r = 10; // Kalder metoder fra en anden klasse // uden at oprette en instans af et objekt af denne klasse Console.WriteLine("Area of ​​en cirkel med radius (0) = (1 :#.##)",r,myCircle.SqrCircle(r)); Console.WriteLine("Længden af ​​cirklen er (0:#.##)" ,myCircle.LongCircle(r)); Console.ReadLine() ) )

Følgende begrænsninger gælder for brugen af ​​statiske metoder:

    En metode af typen statisk må ikke have denne reference, da en sådan metode ikke udføres i forhold til noget objekt

    En metode af typen static kan kun direkte kalde andre metoder af typen static, men ikke en instansmetode fra samme klasse. Pointen er, at instansmetoder fungerer på specifikke objekter, og en statisk metode kaldes ikke på et objekt. Følgelig har en sådan metode ikke objekter, som den kan fungere med.

    Lignende begrænsninger gælder for data af den statiske type. En metode af typen static har kun direkte adgang til andre data af typen static defineret i dens klasse. Især kan han ikke operere på en instansvariabel i sin klasse, da han ikke har objekter, som han kunne operere med

Statiske konstruktører

Konstruktøren kan også erklæres statisk. En statisk konstruktør bruges typisk til at initialisere komponenter, der gælder for en hel klasse i stedet for en enkelt forekomst af et objekt i den klasse. Derfor initialiseres klassemedlemmer af en statisk konstruktør, før nogen objekter i den klasse oprettes:

Brug af System; ved hjælp af System.Collections.Generic; ved hjælp af System.Linq; ved hjælp af System.Text; navneområde 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("Adgang til en forekomst af klasse a: " + MyClass.a); MyClass obj = new MyClass(); Console.WriteLine("Adgang til en forekomst af klasse b: " + obj. b); Console .ReadLine() ) )

Bemærk, at den statiske type-konstruktør kaldes automatisk, når klassen først indlæses, før instanskonstruktøren. En mere generel konklusion fra dette er, at en statisk konstruktør skal udføres før enhver instanskonstruktør. Desuden har statiske konstruktører ikke adgangsmodifikatorer - de har standardadgang og kan derfor ikke kaldes fra et program.

Statiske klasser

Klassen kan erklæres som statisk. En statisk klasse har to hovedegenskaber. Først skal du oprette objekter af en statisk klasse det er forbudt. Og for det andet bør en statisk klasse kun indeholde statiske medlemmer. En statisk klasse oprettes ved hjælp af følgende form for klasseerklæring, modificeret ved hjælp af det statiske nøgleord.

statisk klasse klassenavn ( // ...

Statiske klasser bruges hovedsageligt i to tilfælde. For det første kræves en statisk klasse ved oprettelse udvidelsesmetode. Udvidelsesmetoder er primært forbundet med LINQ-sproget. Og for det andet bruges en statisk klasse til at gemme en samling af statiske metoder relateret til hinanden.

Så kan vi få adgang til dem direkte gennem klassenavnet og scope-opløsningsoperatøren. Men hvad hvis statiske medlemsvariabler er private? Overvej følgende kode:

I dette tilfælde kan vi ikke få direkte adgang til Anything::s_value fra main(), da dette medlem er privat. Typisk tilgås private medlemmer af en klasse via offentlige metoder. Mens vi kunne oprette en almindelig metode til at få adgang til s_value, ville vi så være nødt til at oprette et objekt af den klasse for at bruge metoden! Der er en bedre mulighed: vi kan gøre metoden statisk.

Svarende til statiske medlemsvariabler, statiske metoder er ikke bundet til et enkelt klasseobjekt. Her er eksemplet ovenfor, men med en statisk metode:

class Anything (privat: static int s_value; public: static int getValue() (retur s_value; ) // static method ); int Anything::s_value = 3; // definition af en statisk medlemsvariabel i klassen int main() ( std::cout<< Anything::getValue() << "\n"; }

Da statiske metoder ikke er bundet til et specifikt objekt, kan de kaldes direkte gennem klassenavnet og scope-opløsningsoperatoren såvel som gennem klasseobjekter (men dette anbefales ikke).

Statiske metoder har ikke en *this pointer

Statiske metoder har to interessante funktioner. For det første, da statiske metoder ikke er bundet til et objekt, har de ikke ! Dette giver mening, da *this pointer altid peger på det objekt, som metoden opererer på. Statiske metoder virker muligvis ikke gennem et objekt, så *denne markør er ikke nødvendig.

For det andet kan statiske metoder få direkte adgang til andre statiske medlemmer (variabler eller funktioner), men kan ikke få adgang til ikke-statiske medlemmer. Dette skyldes, at ikke-statiske medlemmer tilhører klasseobjektet, men det gør statiske metoder ikke!

Et andet eksempel

Statiske metoder kan defineres uden for klassens krop. Dette fungerer på samme måde som med almindelige metoder. For eksempel:

#omfatte klasse IDGenerator (privat: statisk int s_nextID; // erklæring om en statisk medlemsvariabel offentlig: statisk int getNextID(); // erklæring om en statisk metode ); // Definitionen af ​​en statisk medlemsvariabel er uden for klassens krop. Bemærk venligst, at vi ikke bruger det statiske søgeord her // Start generering af ID'er ved 1 int IDGenerator::s_nextID = 1; // Definitionen af ​​en statisk metode er uden for klassens krop. Bemærk venligst, at vi ikke bruger det statiske søgeord her 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; }

#omfatte

klasse IDGenerator

privat:

statisk int s_nextID ; // erklæring af en statisk medlemsvariabel

offentlig:

statisk int getNextID(); // erklæring om en statisk metode

// Start med at generere ID fra 1

int IDGenerator::s_nextID = 1;

int IDGenerator::getNextID() (retur s_nextID++;)

int main()

for (int count = 0 ; count< 4 ; ++ count )

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

returnere 0 ;

Resultatet af at køre programmet ovenfor:

Næste ID er: 1
Det næste ID er: 2
Det næste ID er: 3
Det næste ID er: 4

Bemærk venligst, at da alle variabler og funktioner i denne klasse er statiske, behøver vi ikke at oprette et objekt af denne klasse for at arbejde med det! En statisk medlemsvariabel bruges til at gemme værdien af ​​den næste identifikator, der skal tildeles den, og en statisk metode bruges til at returnere identifikatoren og øge den.

En advarsel om klasser med alle statiske medlemmer

Vær forsigtig, når du skriver klasser med alle statiske medlemmer. Selvom sådanne "rent statiske klasser" kan være nyttige, har de også deres ulemper.

For det første, da alle statiske medlemmer kun oprettes én gang, kan der ikke være flere kopier af en "rent statisk klasse" (uden at klone klassen og derefter omdøbe den). For eksempel, hvis vi har brug for to uafhængige objekter af IDGenerator-klassen, så vil dette ikke være muligt gennem en "rent statisk" klasse.

C++ understøtter ikke statiske konstruktører

Hvis du kan initialisere en regulær medlemsvariabel via , så burde du logisk set være i stand til at initialisere statiske medlemsvariabler via en statisk konstruktør. Og mens nogle moderne sprog understøtter statiske konstruktører til netop dette formål, er C++ desværre ikke en af ​​dem.

Hvis din statiske variabel kan initialiseres direkte, er der ikke behov for en konstruktør: du kan definere en statisk medlemsvariabel, selvom den er privat. Det gør vi i eksemplet ovenfor med s_nextID. Her er et andet eksempel:

klasse Noget (offentlig: statisk std::vektor s_mychars; ); std::vektor Noget::s_mychars = ( "o", "a", "u", "i", "e" ); // definere en statisk medlemsvariabel

klasse noget

offentlig:

statisk std::vektor< char >s_mychars ;

std::vektor< char >Noget :: s_mychars = ( "o" , "a", "u", "i", "e" ); // definere en statisk medlemsvariabel

Hvis initialisering af din statiske medlemsvariabel kræver eksekvering af kode (såsom en loop), så er der et par forskellige måder at gøre det på. Følgende metode er den bedste:

#omfatte #omfatte klasse Noget (privat: statisk std::vektor s_mychars; public: klasse _nested // definere en indlejret klasse kaldet _nested (public: _nested() // _nested-konstruktøren initialiserer vores statiske medlemsvariabel (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");<< element << " "; } private: static _nested s_initializer; // используем статический объект класса _nested для гарантии того, что конструктор _nested выполнится }; std::vector// Statisk metode til udlæsning af s_mychars static void getSomething() (for (auto const &element: s_mychars) std::cout

#omfatte

#omfatte

klasse noget

privat:

statisk std::vektor< char >s_mychars ;

offentlig:

Noget::s_mychars; // definere vores statiske medlemsvariabel Something::_nested Something::s_initializer; // definere vores statiske s_initializer, som vil kalde _nested konstruktøren for at initialisere s_mychars int main() ( Something::getSomething(); return 0; ) klasse_indlejret

offentlig:

// definere en indlejret klasse med navnet _nested indlejret()

// _nested-konstruktøren initialiserer vores statiske medlemsvariabel

s_mychars. push_back("o");

s_mychars. push_back("a");

s_mychars. push_back("u");

s_mychars. push_back("i");