I dette blogindlæg vil vi undersøge, hvordan objektorienteret programmering adskiller sig fra procedurel programmering, og hvordan dette koncept implementeres i C++.
I programmeringens tidlige dage, kort efter at computere blev udviklet, var procedurel programmering det gængse koncept. Procedurel programmering er konceptet med at udføre brugerinputkode i en forudbestemt rækkefølge. Efterhånden som tiden gik, og kode blev mere og mere kompleks og vanskelig at forstå, opstod konceptet objektorienteret programmering. I modsætning til procedurel programmering involverer objektorienteret programmering oprettelse af flere små enheder kaldet objekter og kombination af dem for at udføre et program. C++ blev født ved at integrere dette objektorienterede programmeringskoncept i det eksisterende proceduresprog C.
Selvom der findes forskellige andre objektorienterede sprog udover C++, er måden, de implementerer objektorienterede koncepter på, forskellig. C++ implementerer objektorienteret programmering gennem konceptet 'Klasse'. I C++ skal du eksplicit fortælle computeren, hvilken type variabel det er. For eksempel, når du bruger en variabel med navnet 'a', skal du tydeligt angive, om 'a' er et heltal, et flydende tal osv. En klasse er ikke en grundlæggende type som et heltal eller et flydende tal; det er en type, der er nydefineret af programmøren. Inden for en brugerdefineret klasse kan du oprette forskellige variabler og funktioner. Hvis du for eksempel opretter en klasse med navnet 'dyr', kan du definere en flydende kommavariabel 'vægt' i den for at repræsentere vægt, og du kan også definere en funktion til at lave lyde. En klasse leverer blot strukturen; faktisk brug er mulig ved at oprette variabler af klassetypen 'dyr'. Dette koncept sammenlignes ofte med en brødform og brød. Du opretter en brødform kaldet en klasse, og bruger derefter denne form til at forme variabler som brød. Variabler oprettet ved hjælp af en klasse kaldes 'objekter'.
Hovedkomponenterne i objektorienterede koncepter er bredt opdelt i arv, indkapsling og polymorfi. C++ implementerer disse elementer inden for klasser. Arv er det koncept, hvor én klasse arver funktionalitet fra en anden klasse. Antag for eksempel, at der er en 'dyr'-klasse og 'løve'- og 'kanin'-klasserne. Da løver og kaniner er dyr, ville et veldesignet program have 'løve'- og 'kanin'-klasserne til at arve det meste af funktionaliteten fra 'dyr'-klassen. Dette giver mulighed for præcis kode ved blot at specificere, at 'løve' og 'kanin' arver fra 'dyr'-klassen uden at omskrive den samme kode. Her kaldes 'dyr'-klassen, der leverer arv, forælderklassen, mens 'løve'- og 'kanin'-klasserne, der modtager arv, kaldes underklasser.
Indkapsling styrer adgangen til en klasses interne information. Hvis vigtige data findes i en klasse, er det risikabelt at tillade vilkårlig adgang til dem. Du kan dog ikke gøre hele klassen privat blot for at beskytte specifikke data. Derfor bruges nøgleord til at skelne mellem hvilke oplysninger der er eksponerede, og hvilke der er skjulte.
Polymorfi betyder, at det samme navn kan opføre sig forskelligt afhængigt af konteksten. I C++ skal du, når du definerer en funktion, eksplicit angive funktionsnavnet, returtypen samt typerne og antallet af variabler, der sendes til funktionen. For eksempel, når du opretter en funktion til at addere to tal, udfører en funktion, der adder heltal, og en, der adder flydende tal, forskellige handlinger. Men selvom de er lignende funktioner, bliver det meget besværligt at huske og bruge dem, hvis du skal give dem forskellige navne. Men i C++, hvis returtypen, inputvariabeltyperne eller antallet af variabler er forskellige, genkendes funktioner med samme navn som forskellige. Desuden behøver en underklasse ikke at replikere al funktionaliteten i sin overordnede klasse. For eksempel, hvis der er en funktion, der laver en dyrelyd, da hvert dyr laver en forskellig lyd, kan underklassen tilsidesætte (omdefinere) denne funktion til at bruge sin egen version.
C++ er et sprog, der er skabt ved at tilføje yderligere syntaks til C, så det kan bruge de fleste af C's funktioner. Derfor bruges pointere, en af C's nøglefunktioner, også direkte i C++. Hvert lagerområde i computerhukommelsen har en unik adresse. En pointer tjener til at pege på denne adresse. Når en funktion skal modtage en variabel for at udføre den, kopierer computeren denne variabel, gemmer den i et nyt rum og udfører derefter funktionen ved hjælp af den variabel. Når funktionsudførelsen er færdig, forsvinder den kopierede variabel. For eksempel, når man udfører en 'swap'-funktion, der udveksler værdierne af to variabler, ændres den kopierede variabels værdi, men den oprindelige variabel forbliver uændret. Men hvis 'swap'-funktionen modtager en pointer til variablen og ændrer dens værdi, peger pointeren på den unikke adresse, så variablens værdi faktisk ændres. C++ leverer også referencefunktionen, som sender selve variablen i stedet for en pointer, hvilket gør den nyttig.
En anden nøglefunktion er understøttelse af generisk programmering. Generisk programmering er et koncept designet til at forbedre genbrugeligheden af kode og programmørens bekvemmelighed. C++'s primære funktion til at opnå dette er skabeloner. Som tidligere nævnt er det muligt at oprette flere funktioner med samme navn, men det er spild af at oprette flere simple additionsfunktioner. Ved hjælp af skabeloner bestemmer computeren automatisk den type (uanset om det er heltal eller flydende komma), som funktionen modtager, og udfører operationen i overensstemmelse hermed. Dette reducerer kodningstiden, gør koden mere præcis og forbedrer læsbarheden.
Et andet element i generisk programmering er STL (Standard Template Library). Dataudnyttelse er afgørende i programmering. Algoritmer til håndtering af data er matematisk organiseret, og datastrukturer er deres implementeringer. Det er dog ikke kun tidskrævende, at programmører genskaber datastrukturer fra bunden hver gang, men det giver heller ingen garanti for, at algoritmen er optimeret. C++ leverer ekspertoptimerede datastrukturer på sprogniveau, hvilket er STL. Programmører vælger og bruger blot den nødvendige datastruktur.
På denne måde tilbyder C++ mange funktioner på sprogniveau for at gøre det nemmere for brugeren. Fordi det blev skabt som en udvidelse af C, har selve sproget komplekse aspekter. Det kan være udfordrende at lære og forstå alle disse koncepter, men takket være C++'s kraftfulde muligheder bruger mange programmører det stadig. Standarden for C++-syntaks fortsætter med at udvikle sig over tid, og forskellige funktioner vil fortsat blive tilføjet i fremtiden for at gøre det nemmere for programmører.