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.
Geschiedenis
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 ontwikkelen ontstond tijdens het programmeren voor zijn PhD-thesis. Stroustrup vond dat Simula bepaalde eigenschappen had die erg behulpzaam waren 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 bij AT&T Bell Labs ging werken kreeg hij de opdracht om de UNIX-kernel te analyseren met het oog op gebruik in distributed computing. Met in gedachten zijn ervaringen bij het schrijven van zijn proefschrift begon Stroustrup aan een project om de programmeertaal C uit te breiden met Simula-achtige eigenschappen. Hij koos voor C omdat het een taal voor algemeen gebruik was die snel en gemakkelijk porteerbaar was en vooral op grote schaal werd gebruikt. Behalve door 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.[2]
In 1983 werd de naam van de taal gewijzigd in C++ (de incremental operator in C is ++). Nieuwe functies werden toegevoegd, waaronder virtuele functies, overloading van functienamen en operators, referenties, constanten, door de gebruiker gestuurde allocatie en vrijgave van geheugen, verbeterde type checking, eenregelig commentaar met twee schuine strepen (forward slashes) (//) zoals dat in BCPL gebruikt werd, alsook de ontwikkeling van een 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.[3]
De eerste commerciële implementatie van C++ werd in oktober 1985 uitgebracht.[4] Versie 2.0 van C++ volgde in 1989 en de geactualiseerde tweede editie van The C++ Programming Language werd in 1991 uitgebracht.[5] 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. Naarmate 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.
C++ was in 2022 een van de meest gebruikte programmeertalen voor het ontwikkelen van professionele applicaties.[6]
voorbeeld: class Taxi: public Vervoermiddel { ... }
Templates
Een andere uitbreiding ten opzichte van C zijn templates (de basis van generiek programmeren). Een template of sjabloon is een functie of klasse die gebruikmaakt 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:
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
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
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 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
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
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 niet op C++. 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
Compilers
Er zijn verschillende compilers beschikbaar, zowel gratis als commercieel. Een aantal bekende zijn:
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++intmain()// 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.usingnamespacestd;// 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 komtintmain(){// declareer twee strings en een integerstringstrNaam;stringstrVoornaam;intnLeeftijd;// vraag om voor- en achternaamcout<<"Wat is uw voor- en achternaam? ";// ontvang invoer van de standaard input stream en plaats die in// de variabelen strVoornaam en strNaamcin>>strVoornaam>>strNaam;// vraag om leeftijdcout<<"Wat is uw leeftijd? ";// ontvang een regel van de standard input en zet die om naar een intcin>>nLeeftijd;// toon de ingevoerde gegevenscout<<"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.