C++

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken
C++
Paradigma multi-paradigma, Objectgeoriënteerd
Verschenen in 1983
Ontworpen door Bjarne Stroustrup
Typesysteem statisch, zwak
Implementaties G++, MS Visual C++, Borland C++ Builder, Intel C++ Compiler, Sun Studio
Dialecten ISO/IEC 14882 1998-2003
Beïnvloed door C, Simula, Ada 83, Algol 68, Smalltalk
Invloed op Ada 95, C#, Java, Perl, D, PHP
Portaal  Portaalicoon   Informatica

C++ (uitgesproken als C plus plus) is een programmeertaal gebaseerd op C.

In tegenstelling tot C is C++ een multi-paradigmataal, wat inhoudt dat er verschillende programmeerparadigma's gebruikt kunnen worden. De taal is ontworpen door Bjarne Stroustrup voor AT&T Labs, als verbetering van C. De naam is afkomstig van de programma-opdracht "C++", wat betekent: verhoog de waarde van de variabele C met 1.

Geschiedenis[bewerken]

Bjarne Stroustrup, een in Denemarken en het Verenigd Koninkrijk opgeleide computerwetenschapper, begon zijn werk aan "C with classes" (C met klassen) in 1979. Het idee om een nieuwe taal te construeren vond zijn oorsprong in Stroustrups ervaring in het programmeren voor zijn PhD-thesis. Stroustrup vond dat Simula bepaalde eigenschappen had die erg behulpzaam zouden zijn voor grootschalige software-ontwikkelingsprojecten, maar dat de taal te langzaam voor praktisch gebruik was. Aan de andere kant was BCPL snel, maar van een te "laag" niveau (te dicht op de "bitjes" en de "bytejes") om voor gebruik in grote software-ontwikkelingsprojecten geschikt te zijn. Toen Stroustrup begon te werken bij AT&T Bell Labs kreeg hij de taak om de UNIX-kernel te analyseren met het oog op gebruik in distributed computing. Een beroep doend op zijn ervaring bij het schrijven van zijn proefschrift begon Stroustrup aan een project om de C-taal uit te breiden met Simula-achtige eigenschappen. Hij koos voor C omdat het een taal voor algemeen gebruik, snel, gemakkelijk overdraagbaar was van het ene naar het andere computerplatform en vooral een taal die op grote schaal werd gebruikt. Behalve C en Simula werd hij ook geïnspireerd door Algol 68, Ada, CLU en ML. In eerste instantie werden de klasse, afgeleide klasse, sterke typering, inlining en default argument-eigenschappen via "C met klassen" aan de C-compiler, Cpre, toegevoegd.[1]

In 1983 werd de naam van de taal "C with classes" gewijzigd in C++ (de incremental operator in C is ++). Nieuwe functies werden toegevoegd, waaronder virtuele functies, functienamen en operator-overloading, referenties, constanten, door de gebruiker gecontroleerde allocatie en vrijgave van geheugen, verbeterde typechecking, BCPL-stijl-achtig commentaar in één regel met twee schuine strepen (forward slashes) (//), alsook de ontwikkeling van een goede compiler voor C, Cfront. In 1985 werd de eerste editie van The C Programming Language uitgebracht. Dit werd snel een belangrijk naslagwerk voor de taal, aangezien er op dat moment nog geen officiële standaard was.[2]

De eerste commerciële implementatie van C werd in oktober 1985 uitgebracht.[3] Versie 2.0 van C++ volgde in 1989 en de geactualiseerde tweede editie van The C++ Programming Language werd in 1991 uitgebracht.[4] Onder de nieuwe eigenschappen waren meervoudige overerving, abstracte klassen, statische memberfuncties, const-memberfuncties en beschermde members. In 1990 werd The Annotated C++ Reference Manual gepubliceerd. Dit werk werd de basis voor de toekomstige standaard. Latere toevoegingen aan C++ zijn onder andere templates, exception handling, naamruimten, nieuwe casts en een booleaans datatype. Naar mate de C++-taal evolueerde, evolueerden de standaardbibliotheken mee. De eerste toevoeging aan de C++-standaardbibliotheek was de stream I/O-bibliotheek. Deze bibliotheek bood faciliteiten om de traditionele C-functies zoals printf en scanf te vervangen. Later was onder de belangrijkste toevoegingen aan de standaard bibliotheek een grote hoeveelheid van de Standard Template Library.

Het is mogelijk om in hetzelfde programma in C++ zowel objectgeoriënteerde als procedurele code te schrijven. Dit heeft tot enige bezorgdheid geleid dat sommige C++-programmeurs nog steeds procedurele code schrijven, terwijl zij de indruk hebben dat zij objectgeoriënteerde code schrijven, alleen omdat zij C++ gebruiken. Vaak is het een samensmelting van de twee. Dit veroorzaakt vaak problemen wanneer de code na enige tijd opnieuw in detail moet worden doorgrond of wanneer de ene programmeur zijn werk aan een ander moet overdragen.[5]

C++ wordt op dit moment nog steeds gebruikt en was in 2011 een van de favoriete programmeertalen voor het ontwikkelen van professionele applicaties[6]

Kenmerken[bewerken]

Objectgeoriënteerd[bewerken]

De belangrijkste uitbreiding op C is de toevoeging van klassen voor objectgeoriënteerd programmeren. De klasse-ondersteuning omvat onder andere

vb: virtual void Print();
vb: virtual void Print()=0;
vb: class Taxi: public Vervoermiddel { ... }

Templates[bewerken]

Een andere uitbreiding ten opzichte van C zijn templates (de basis van generiek programmeren). Een template of sjabloon is een functie of klasse die gebruik maakt van een abstract datatype.

Een voorbeeld is het berekenen van het gemiddelde van twee getallen. In plaats van aparte functies voor int, float en double kan een templatefunctie gebruikt worden:

template <class T>
T gemiddelde(T a, T b) {
  return (a+b) / 2;
}

Deze functie kan vervolgens voor alle datatypen gebruikt worden die de operatoren + en / ondersteunen.

Andere uitbreidingen ten opzichte van C[bewerken]

Naast de object-georiënteerde uitbreidingen biedt C++ nog enkele nieuwe zaken die in C niet aanwezig waren op dat moment.

  • Een nieuwe commentaarstijl voor een enkele regel (met "//").
  • De mogelijkheid variabelen te declareren vlak voor gebruik.
  • Naamruimten.
  • Function-overloading.
  • Operator-overloading.
  • Exception handling.
  • Inline functies (ook beschikbaar in de C99-standaard).
  • Een standaard string-type.
  • Een standaard bool-type.
  • Naast pointers ook references.
  • Standaardwaarden bij het weglaten van argumenten.
  • De operatoren 'new' en 'delete' ter vervanging van de functies 'malloc' en 'free'.

De C++-standaardbibliotheek en STL[bewerken]

De standaardbibliotheek bevat alle functionaliteit van C, met daarbij een verzameling templates: de Standard Template Library (STL). Dit zijn algemene templates voor het beheren van containers als vectors, lists en maps.

Bekende bibliotheken[bewerken]

  • STL: Standard Template Library, de standaard.
  • Boost: Boost C++ Library, bevat onder andere toekomstige toevoegingen aan de standaard.
  • Qt: zeer uitgebreid en cross-platform, onder andere vooral gebruikt voor GUI-toepassingen.
  • MFC: Microsoft Foundation Classes, gericht op Windows-toepassingen.
  • WTL: Windows Template Library, gericht op Windows-toepassingen.
  • ATL: Active Template Library, gericht op Windows-toepassingen.

Geen zuivere superset van C[bewerken]

In tegenstelling tot wat vaak wordt beweerd, is C++ geen zuivere superset van C. Niet alle geldige C-code is automatisch geldige C++-code. De meeste C-code zal probleemloos als C++ gecompileerd worden, maar er zijn kleine verschillen. Een andere programmeertaal, Objective-C, is wel een superset van C.

Vergelijkbare talen[bewerken]

Andere object-georiënteerde talen die grotendeels gebaseerd werden op C++, zijn:

Ook PHP, hoewel een scriptingtaal, heeft sinds versie 4 (en vooral sinds 5) veel weg van C++.

Objective-C lijkt dan weer niet op C++. Maar beide talen ontstonden als object-georiënteerde uitbreiding op C, hun gemeenschappelijke voorouder. Hierdoor delen ze toch wat gelijkenissen en zijn ze tegenwoordig zelfs combineerbaar als Objective-C++ 2.0.

Implementatie[bewerken]

Compilers[bewerken]

Er zijn verschillende compilers beschikbaar, zowel gratis als commercieel. Een aantal bekende zijn:

IDE's[bewerken]

C++-voorbeelden[bewerken]

Een eenvoudig programma om "Hello World!" op het scherm te tonen, ziet er bijvoorbeeld zo uit:

 #include <iostream>  // Dit regelt de standaard in- en uitvoer binnen C++
 
 int main()      // De uitvoering van het programma begint bij main()
 { 
   // Schrijf "Hello World!" naar de standard output stream cout (in de namespace std::)
   std::cout << "Hello World!" << std::endl;
 }

Merk in dit voorbeeld op dat de functie 'int main()' geen return-statement bevat: volgens de C++ standaard geeft de main-functie uit zichzelf de waarde 0 (nul) terug tenzij een andere return-waarde meegegeven wordt. Een 'return 0' statement is dus overbodig.

Een eenvoudig voorbeeld van een C++-consoleprogramma dat standaard invoer accepteert en uitvoer op het scherm toont, ziet er als volgt uit:

 #include <iostream> // voeg de I/O bibliotheek toe (voor std::cin en std::cout)
 #include <string>  // voeg de string bibliotheek toe (voor std::string)
 
 // cin, cout en string zijn onderdeel van de std:: namespace.
 using namespace std; // maakt namespace std bruikbaar zonder de std:: kwalificatie. 
           // 'using namespace' is handig omdat het minder typewerk is. Maar
           // in grotere projecten kan je het beter niet gebruiken, omdat je
           // dan niet kan zien uit welke namespace een variabele komt
 
 int main()
 {
   // declareer twee strings en een integer
   string strNaam;
   string strVoornaam;
   int nLeeftijd; 
 
   // vraag om voor- en achternaam
   cout << "Wat is uw voor- en achternaam? "; 
 
   // ontvang invoer van de standaard input stream en plaats die in 
   // de variabelen strVoornaam en strNaam
   cin >> strVoornaam >> strNaam;
 
   // vraag om leeftijd
   cout << "Wat is uw leeftijd? ";
 
   // ontvang een regel van de standard input en zet die om naar een int
   cin >> nLeeftijd;
 
   // toon de ingevoerde gegevens
   cout << "Hallo " << strVoornaam << " " << strNaam << endl;
   cout << "U bent " << nLeeftijd << " jaar oud." << endl;
 }

Een voorbeeld van een C++-consoleprogramma dat de kracht van de STL-templates laat zien:

Met dit programma kun je een aantal getallen ingeven, die vervolgens na het ingeven van het eerste niet-getal gesorteerd zullen worden en op het console getoond.

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
using namespace std;
 
int main ()
{
 vector<int> v;
 istream_iterator<int> start (cin);
 istream_iterator<int> end;
 back_insert_iterator<vector<int> > dest (v);
 
 copy (start, end, dest);
 sort(v.begin(), v.end());
 copy (v.begin(), v.end(), ostream_iterator<int>(cout, "\n"));
}

Zie ook[bewerken]

Voetnoten[bewerken]

  1. Bjarne Stroustrup, HOPL II paper
  2. Bjarne Stroustrup, The C Programming Language, 1e editie
  3. Bjarne Stroustrup, FAQ, When was C++ invented?
  4. Bjarne Stroustrup, C++ Programming Language, 2e editie
  5. Bhatti M.U., Ducasse, S., Rashid, A, Aspect Mining in Procedural Object Oriented Code, Proceedings of the International Conference on Program Comprehension , mei 2008, blz. 230-35, zie hier.
  6. Most Popular Programming Languages.

Externe link[bewerken]

Wikibooks Wikibooks heeft een studieboek over dit onderwerp: Cursus programmeren in C++.