Cplusplus:Introduksjon
Fra CodeWiki
I denne introduksjonen skal vi se på noen av de mest fundamentale aspektene ved C++. Dette er ikke beregnet som en tutorial for nybegynnere, men heller en oversikt over grunnleggende elementer.
Innhold |
Deklarasjoner
Når man deklarerer noe, enten det er en funksjon, variabel, klasse, eller liknende, består den av fire deler;
- en spesifikator (specifier) (ikke påkrevd)
- en type
- et navn (identifier)
- en intialisering (ikke påkrevd)
En deklarasjon ender avsluttes alltid med et semikolon bortsett fra når man definerer et namespace eller en funksjon.
Variabler
En variabel i C++ er et objekt som kan lagre informasjon i minnet. En variabel har en bestemt type.
int i = 10; // type, navn og initialiseringsverdi char c; // type og navn std::string monkey = "Julius" // type, navn og initialiseringsverdi static int count; // spesifikator, type og navn
Når vi deklarerer en lokal variabel uten en initialiseringsverdi, er den uinitialisert. En variabel deklarert globalt, i et namespace, eller statisk (enten i en klasse eller i en funksjon), blir automatisk initialisert til 0 (null). For en variabel som er deklarert lokalt (i et scope), for eksempel i en funksjon, "lever" variabelen til funksjonen går "out of scope", og returnerer. En lokal variabel er allokert på stacken, og blir "frigjort" når variabelen går "out of scope".
Pekere
C/C++ har to hovedtyper pekere: pekere til data og pekere til funksjoner
Pekere til data
Pekere inneholder minneadresser. Vi sier at en peker "peker" til en minneadresse. Minneadressen kan være adressen til en annen variabel, eller det kan være en adresse som pekeren har "fått" ved å allokere minnet dynamisk. Når vi bruker vanlige variabler, skjer minnehåndteringen automatisk. Minnet allokeres når vi deklarerer funksjonen, og destrueres når den går out-of-scope. Med pekere, kan vi allokere minnet automatisk, og dermed ha full kontroll over levetiden til objektet:
int* foo = new int; *foo = 10; delete foo;
Her lager vi først en int-peker og allokerer minne dynamisk ved å bruke new-operatoren. Så setter vi verdien av objektet som foo peker på til å være 10. Dette gjør vi ved å bruke operator* (dereference operatoren). Denne tar en peker som et argument, og returnerer det den peker til (som i dette tilfellet er en int).
Pekere til funksjon
Pekere til funksjoner finnes på samme måte som i C, men C++ har også støtte for peker til klasse funksjoner.
int SimpFunc(int param){return param;} int (*pt2Function)(int); pt2Function = &SimpFunc; int RetValue = pt2Function(1);
Her definerer vi først en enkel funksjon som vi senere skal peke til. Så definerer vi pekeren pt2Function som tar en int parameter og returnerer en int, når det er gjort så angir vi at pekeren skal peke til funksjonen SimpFunc. Til slutt kalles vi SimpFunc via pekeren pt2Function.
Arrays
Et array inneholder mange objekter av samme type:
int a[10]; int i[5] = { 1, 3, 4 } const char* words[] = { "One", "little", "monkey" }; char celebrity[] = "Julius the Monkey";
På den første linjen lager vi et array bestående av 10 heltall av typen int. På den andre linjen lager vi en array bestående av 5 heltall, og vi gir også en array initialiserer. Denne initialiserer de tre første elementene av arrayet, i[0], i[1] og i[2] med de respektive veridene 1, 3 og 4. De resterende to settes automatisk til 0. I det siste eksempelet lager vi en array av const char*. Legg merke til at vi ikke spesifiserer noen størrelse på arrayet. Dette kan kompilatoren gjøre automatisk når vi gir den en array initialiserer.
Man kan lese og skrive til en array ved å bruke []-operatoren:
std::cout << i[0] << std::endl; // Printer verdien av a[0] til skjermen words[1] = "big"; // Setter words[1] til "big"
Funksjoner
Funksjoner er avgrensede programblokker som kan "kalles". Når en funksjon kalles blir funksjonen lastet til minnet, og programmet begynner å kjøre fra funksjonen. Når funksjonen er ferdig med å kjøre (returnerer), hopper programmet tilbake til der den ble kalt fra.
Det er forskjell på å deklarere og definere en funksjon. Når vi deklarerer en funksjon, sier vi bare at den finnes:
int add(int, int); // Det finnes en funksjon som heter add. Den tar to int som argumenter, og returnerer en int.
Når vi definerer funksjonen, skriver vi programkoden som kjøres når funksjonen kalles:
int add(int a, int b) { return a + b; }
Vi kan kalle funksjonen på følgende måte:
int sum = add(10, 10); std::cout << sum << std::endl; // Skriver ut 20 på skjermen
Se også: Funksjoner.
Klasser
Klasser gjør det mulig å lage brukerdefinerte typer. Klasser er en av de viktigste elementene innen objektorientert programmering, og gjør det mulig å abstrahere programkoden til et nivå hvor man tenker i form av objekter. Dette er mer nærliggende hvordan vi mennesker tenker til vanlig, og betyr derfor at vi får mer ryddig ov oversiktlig kode.
En klasse defineres på følgende måte:
class navn-på-klasse [: baseklasser,] { medlemmer };
Eksempel:
class Monkey { public: void set_name(const std::string&) const; void set_age(int) const; private: std::string name; int age; }; void Monkey::set_name(const std:.string& nn) { name = nn; } void Monkey::set_age(int aa) { age = aa; } Monkey monkey; monkey.set_name("Julius"); monkey.set_age(17);
Her har vi definert en klasse som har to variabler av typen std::string, og to metoder (funksjoner som er definert i en klasse) som setter navn og alder.
Se også: Strukturer og klasser.
Namespace
C++ lar deg lage ditt eget navnerom eller namespace. Dette gjør at du ikke "forsøpler" det globale navnerommet, og det gjør det mulig å for eksempel strukturere klasser, funksjoner, variabler, osv. i logiske enheter:
namespace Audio { class File { ... }; } namespace IO { class File { ... }; } Audio::File gunshot("audio/gunshot.mp3"); IO::File highscore("data/highscore.txt");
Et namespace kan åpnes flere ganger:
namespace Audio { class MP3 : public Audio::File { ... }; }
