C++ og klasser
ForordI denne artikel vil jeg vise hvordan man kommer igang med klasser. Jeg ville gerne fortælle alt om klasser, men da det er et så komplekst emne vil jeg kun fortælle om det mest basale. Artiklen er ikke en artikel for en absolut begynder, da artiklen kun er om klasser og hvad dertil hører. Men tilgengæld er C++ et kendt sprog, så det er ikke just svært at finde guides, tutorials, sourcecode, etc. omkring sproget. Jeg har valgt at dele artiklen op i små kapitler. Hvert kapitel starter ud med et lille forord, så man kan se hvad der kommer i kapitlet. Til slut, slutter jeg af med en lille note. Nu har jeg ikke mere at sige end, håber i nyder den!Indholdsfortegnelse1.0 Klasser1.1 Hvad er en klasse? 1.2 Hvorfor bruge klasser? 2.0 Lad os komme igang 2.1 Vores første klasse 2.2 Konstruktøren 2.3 Destruktøren 2.4 Et lille program 3.0 Static, const, ... 3.1 static 3.2 const 3.3 mutable 3.4 inline 3.5 This-pointeren 4.0 Her til slut... 1.0 KlasserMan kan ikke sige at klasser i sig selv er en del af C++, man kan derimod sige at klasser er en del af emnet OOP. Objekt Orienteret Programmering er den helt nye stil inden for programmering. Flere og flere sprog har efterhånden fået OOP intergreret, bl.a. kan disse nævnes: PHP, Python, Diverse Lisp-dialekter og mange flere. Jeg vil nu ikke fortælle så meget om OOP generelt, kun i C++-sammenhæng. C++ blev udviklet af danskeren, Bjarne Stroustrup i "79, så det var på samme tid ham der introducerede OOP i C++-verdenen. Nok om det, jeg fornemmer at I vil igang med hvad det nu er det hele handler om, Klasser.1.1 Hvad er en klasse?Klasser er som sagt en del af OOP. I sproget C, blev alting altid gjort i en stor smøre. Det var selvfølgelig struktureret, men ikke så godt som nu. I C-dagene brugte man, struct"s. Struct"s findes stadig i C++ og er stærkt beslægtet med både klasserne og union"s. Det som klassen har, og som struct"s og union"s ikke har, er at man kan både gøre brug af polymorfi, arv og meget meget mere. Disse ting vil jeg desværre ikke gennemgå i denne artikel, men det kan være det kommer en anden god gang? Du er måske interesseret i hvorfor man overhovedet bruger klasser, hvis du er, som jeg også var da jeg startede, så læs blot videre...1.2 Hvorfor bruge klasser?Hvis man arbejder med store mængde data, store systemer eller lignende, kan det godt være svært at holde styr på det hele. En klasse gør det netop nemmere at holde styr på det hele. I en klasse kan du holde stort set alt hvad du vil, templates, funktioner, variabler, structs, osv. Jeg bruger personligt klasser - og OOP i det hele taget, meget. Især til COM og Win32-programmering. Ta" et Win32-program, det fylder snildt over 2-300 linjer, og så kan det til tider være svært at holde overblikket. Ved brug af klasser, kan men hælde diverse funktioner op i klassen og bruge den derudfra. Det gør det også nemmere at f.eks. bruge flere headerfiler så man igen får endnu mere overblik. Det er generelt godt at lære OOP, da det er en del af "fremtidens" programmering.2.0 Lad os komme igangJeg vil i dette kapitel vise hvordan en simpel klasse implementeres. Jeg slutter af med et program, så I kan se hvordan et eksempel med brug af klasser kunne være. Jeg vil derudover fortæller lidt om Konstruktøren og Destruktøren. Jeg venter med de lidt mere advancerede funktioner og tingel-tangel til næste kapitel. Nu skal I først og fremmest lære at bruge en klasse og for ikke at tale om, forstå den!2.1 Vores første klasseDer er 2 grundlæggende ting, man altid skal huske. Den første er, nøjagtig som normale variabler, at navnet på klassen IKKE må starte med et tal. Navnet skal starte med enten underscore ( _ ) eller et bogstav fra det engelske alfabet ( a...z ). Den anden ting er at man skal huske et semikolon ( ; ) i slutningen af klassen. Det er det samme som ved eksempelvis en struct, men ikke en funktion da funktioner ikke afslutter med et semikolon. Lad os se skeletet af en klasse...
2.2 KonstruktørenKonstruktøren er måske den vigtigste del af en klasse. Om du vil det eller ej vil der altid være en konstruktør. Hvis du ikke selv laver den, laver kompileren den, så der er ingen vej udenom. En konstruktør laves præcist når du initalisere din variabel af den type klasse med konstruktøren. Man kan give en konstruktør parameter, som den så sætter ind i klassen eller bruger lige fra start. En konstruktør hedder det samme som klassen selv, så i vores tilfælde hedder den VoresKlasse(). Lad os lave en simpel konstruktør, hvorefter vi bagefter vil lave en konstruktør som der tager parametre.
2.3 DestruktørenDestruktøren gør nøjagtig det samme som konstruktøren, dog sættes destruktøren først igang når klassen lukkes ned. Det er ikke muligt at give destruktøren parametre på samme måde som med konstruktøren. Destruktøren har på samme måde som konstruktøren det samme navn som selve klassen, dog starter den med et Bitvis komplement ( ~ ) så i vores situation ville det se således ud ~VoresKlasse().
2.4 Et lille programNu burde I efterhånden have nogenlunde styr på klasserne og hvordan de fungerer. Her i slutningen af dette kapitel vil jeg slutte af med et lille eksempel, som både gør brug af hvad vi har gennemgået: public, private, konstruktøren og destruktøren. I eksemplet indsætter jeg en konstruktør og destruktør med tekster samt tekster i funktionerne, så I kan se hvordan at klassen er opbygget og løber. Selve hovedfunktionen plusser 2 tal sammen hvorefter man kan hente dem med en anden funktion.
3.0 Static, const, ...Her i det sidste kapitel omhandlende klasser vil jeg fortælle lidt om de lidt mere advancerede ting. Af ting jeg vil fremhæve er static, const, mutable og This. Static bruges til at holde ting statiske. Const kender du muligvis hvis du har lidt erfaring med C og C++. Det bruges selvfølgelig til at gøre en hel funktion constant, så den ikke kan bruges til at ændre eksempelvis andre variabler. Hvis man har problemer med en funktion som er const, er der heldigvis en løsning, mutable, den bruges til at kunne lade en variabel i en const ændre. Lige før vi tager fat i This, skal vi snakke lidt om inline, som er en mindre vigtig del, men alligevel god at kende. Til sidst, en vigtig del af klasser, This-pointeren. This peger på objektet selv, mere om det i selve kapitlet.3.1 staticVed brug af static vil alle objekter have det samme. Normalt hvis man oprettede et objekt, test1, og plusede X med én, så ville den gå på nul igen hvis man oprettede et nyt objekt, test2. Men ved brug af static ville den fortsætte med at tælle i test2, så den ville komme op på 2, istedet for kun 1. Lad os lave et eksempel hvor man i konstruktøren tæller en op. Vi bruger selvfølgelig lige en static int-variabel, x. Læg mærke til hvordan den skal implementeres i forhold til klassen.
3.2 constNår en funktion i en klasse er const bliver den for det meste brugt til enten returværdier eller at udskrive. I en const funktion kan man ikke ændre variabler. Hvis man prøver at ændre en variabel i const-funktion vil din kompiler komme med fejl, eller en advarsel. Modsat variabler af const, så skal const sættes efter funktionens navn og parameter-liste.
3.3 mutableMed nøgleordet mutable kan man sætte en variabel i en klasse til godt at kunne blive ændret gennem en const-funktion. Der er egentligt ikke meget at sige om mutable, så i stedet vil jeg komme med et eksempel.
3.4 inlineInline funktioner bliver egentligt ikke brugt så meget mere, men er stadigvæk en, til tider, stor del af klasser. I C-tiden var inline en vigtig del da det speedede programmet op. Nu om dage er kompilerne blevet så gode at man egentligt ikke rigtigt har brug for nøgleordet inline mere. Dog gør det en lille forskel, og derfor har den også fået en lille plads her i min artikel. Inline skal ikke bruges til store funktioner, men mest bare til små funktioner som bliver brugt ofte og evt. kun udskriver en værdi eller returnerne en værdi. Inline bruges ikke kun i klasser, som du muligvis ved hvis du har lidt erfaring med C/C++ generelt. Det kan sagten bruges uden for klasser på helt normale funktioner. Inline-nøgleordet bliver sat lige før funktionens returtype, og derefter kører det bare derudaf. Jeg ville egentligt ikke have lavet et eksempel til denne sektion, men synes alligevel lige at I skulle have et eksempel med, så I kan se hvordan det f.eks. kan blive brugt.
3.5 This-pointerenThis-pointeren kan godt være lidt tricky, så hvis du ikke har nogenlunde styr på pointers er dette kapitel ikke lige for dig. This-pointeren er en pointer der peger på selve objektet selv. Det ville være nogenlunde det samme hvis man gjorde sådan her:
4.0 Her til slut......vil jeg sige, at jeg håber I har nydt artiklen, lige så meget som jeg har nydt at skrive den. Måske mener I at der mangler noget i artiklen, men jeg har valgt at tage med hvad jeg synes er relevant at have med i en artikel for nybegynderer til klasser. Til dem som ønsker at gå videre, kan vente på at jeg (måske?) skriver endnu en artikel eller at finde en af de mange tutorials på nettet. Af ting som jeg bl.a. ikke har fremhævet i denne artikel, kan nævnes: polymorfi, arv, virtual, friends, overloading, templates m/ klasser, abstrakte klasser, multiple arv, indkapsling og meget meget mere, så der er masser at gå igang med. Hvis I skulle have noget kritik, så gør det konstruktivt og ikke, "Fucking lorte artikel, jeg hader dig".Igen, håber I har nydt artiklen. Hyg jer derude! Sidst redigeret 13:52 04/06/2007 af Rowl |
|
Kommentarer
Giv din mening tilkende om denne artikel, eller læs andres.Har du spørgsmål eller brug for hjælp til denne artikel henvises du til forummet.
| 5/5 nice, men fatter bare ik c++ :D men måske skal jeg bare læse det igennem flere gange :D |
Oprettet af:
|
| Det er godt nok en lang en :) Desvære er jeg ikke lige typen der koder men godt ser det da ud ;) |
Oprettet af:
|
|
Flot artkikel, har helt klart hjulpet på min forståelse af C++. Du mangler dog et mellemrum i første linje efter ""Forord"", hvor der står fortællealt. Sidst redigeret 15:02 - 07/09/2006 |
Oprettet af:
|
|
Tusind tak allesammen. Og den lille fejl er nu rettet, tak for oplysningen. :)! Sidst redigeret 08:35 - 08/09/2006 |
Oprettet af:
|
Hvorfor skriver du:
Sidst redigeret 18:35 - 20/10/2006 |
Oprettet af:
|
|
Fordi min metode er korrekt og følger alle C++ standarder. Hvorfor skulle jeg sætte en returtype når jeg intet returnerer?
Det er det samme med main-funktionen, vi skriver jo heller ikke...
|
Oprettet af:
|
|
Jeg forstår godt du ikke tager arv, polymorfi og alt det andet med i din artikel, men jeg synes du burde komme med et minimum af forklaring når du bruger ordene. Det er irriterende at sidde og støde på et sådan ord, som man ikke aner hvad skal betyde ;) Du tager også inline med i din artikel, hvilket jeg synes er en god ide, men du bruger adskillige linier blablabla om at inline bruges ikke mere, men det gør det alligevel og det gør ting og sager hurtigere, men du forklarer ikke med et eneste ord hvad inline gør, du siger bare "det gør en lille forskel"... jo tak, hvilken??? Sidst redigeret 14:16 - 04/11/2006 |
Oprettet af:
|
|
Jeg synes ikke det er nødvendigt at skrive hvad polymorfi, arv, etc. betyder. Hvis jeg læste en lang artikel om allerede mange emner, og jeg ikke mestrede halvdelen af artiklen, ville jeg ikke til at blive flasket op med en masse andre fagudtryk. Jeg synes godt man kan vente til at man mestrer de forskellige teknikker, og derefter gå ud og finde ud af hvad det andet betyder. Jeg kan sagtens se hvor du vil hen med det, men personligt tager jeg et skridt af gangen. :-) I C-tiden var inline en vigtig del da det speedede programmet op. Nu om dage er kompilerne blevet så gode at man egentligt ikke rigtigt har brug for nøgleordet inline mere. Dog gør det en lille forskel, og derfor har den også fået en lille plads her i min artikel. Synes selv at det forklarer hvad inline blev/bliver brugt til. Inline bliver som jeg skrev brugt til at gøre ens program hurtigere, og ikke rigtigt andet. En forklaring på hvordan man gør kom på næste linjeInline skal ikke bruges til store funktioner, men mest bare til små funktioner som bliver brugt ofte og evt. kun udskriver en værdi eller returnerne en værdi. Jeg kan ikke helt selv se hvad jeg mere skulle forklare, men du er velkommen til at komme med nogle idéer. :-) |
Oprettet af:
|
|
Okay, men artiklen henvender sig jo til os der læser den, som måske er nysgerrige efter hvad de ord betyder, selvom de ikke er relevante for artiklen, men så er der vel i og for sig heller ikke nogen grund til at nævne dem. Ja, du forklarer hvad inline bliver brugt til, men ikke hvordan det bruges - det var det jeg mente, du kunne f. eks. lave et simpelt eksempel med det, det behøver ikke være noget stort hvis det som sagt ikke rigtigt bliver brugt længere. Bare en idé som du bad om ;). Din forklaring på "hvordan man gør", er da ikke en forklaring på hvordan man gør, du siger bare at den mest bruges til små funktioner... Her ville et eksempel igen være glimrende. Jeg kan heller ikke se hvad du udover det skulle forklares, for jeg siger skam ikke din artikel er dårlig eller dårligt forklaret, jeg er sgu glad for at have en sådan artikel ved hånden, da du er den eneste der virkelig kan programmere C++ herinde fra, efter hvad jeg har fornemmet. Laver du også API? |
Oprettet af:
|
|
Der er faktisk et eksempel til brug af inline. Kig under afsnittet "inline", der finder du et lille eksempel. Kan godt se hvor du vil hen med det, og giver dig til en vis grad ret. Jeg vil dog ikke til at begynde at rette i artiklen, men nu ved jeg det da til en anden gang. Godt med lidt konstruktiv kritik. :-) jeg er sgu glad for at have en sådan artikel ved hånden, da du er den eneste der virkelig kan programmere C++ herinde fra, efter hvad jeg har fornemmet. Tusind tak for de fine ord! :-)Laver du også API? Der findes mange forskellige former for API"s, men går udfra at du snakker om Win32API"et? I så fald, så ja. Dog har jeg ikke fået lavet det store, men har ikke rigtigt haft idéerne heller. Sådan som jeg programmerer med Win32API"et er dog ikke sådan som man ser det rundt omkring på nettet. De fleste steder på nettet er det hele i en stor smøre. Når man har OOP ved hånden har jeg valgt at benytte det. Man får bedre overblik over ens program med klasser, men det er også en del svære end at lave det hele i en stor smøre. Går udfra du også selv har haft gang i noget Win32API siden du spørger? :-) |
Oprettet af:
|
Side af 2
