C++

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.

Met de naam wordt uitgedrukt dat de taal een verbetering is van C, zo sterk verbeterd dat C+ onvoldoende eer zou zijn. Bovendien is de naam een knipoog naar de vaak voorkomende operator ++, waarmee de waarde van een variabele met 1 wordt verhoogd.

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.

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.

De eerste commerciële implementatie van C++ werd in oktober 1985 uitgebracht. Versie 2.0 van C++ volgde in 1989 en de geactualiseerde tweede editie van The C++ Programming Language werd in 1991 uitgebracht. 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 meestgebruikte programmeertalen voor het ontwikkelen van professionele applicaties.

Kenmerken

Objectgeoriënteerd 
De belangrijkste uitbreiding op C is de toevoeging van klassen voor objectgeoriënteerd programmeren. Het is daardoor mogelijk in C++ objectgeoriënteerde en procedurele code te combineren.

De klasse-ondersteuning omvat onder andere
 virtuele functies
voorbeeld: virtual void Print()
 abstracte klassen (of methoden)
 voorbeeld: virtual void Print()=0;
 en (meervoudige) overerving.
 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:

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 
Naast de object-georiënteerde uitbreidingen bood 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.
 Functie-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 
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:

 Java
 D
 C#

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:

 GCC (Linux en vele ports naar andere besturingssystemen)
 Cygwin (POSIX-omgeving met een Windows-port van GCC)
 MinGW (Windows-port van GCC)
 Microsoft Visual C++ (Windows)
 Intel C++-Compiler (Linux, Windows)
 Clang, deel van het LLVM-project (verschillende besturingssystemen)

IDE's 
Er bestaan verschillende IDE's voor C++:
 Visual Studio van Microsoft (Windows)
 Dev-C++ Open source IDE met ingebouwde MinGW compiler (Windows, Linux)
 QtCreator, onderdeel van Qt (Windows, Linux en Mac OS)
 KDevelop, een IDE voornamelijk gericht op de ontwikkeling van KDE en Qt-programma's (Linux)
 Code::Blocks, een gratis C en C++ IDE (Windows, Linux) gebaseerd op wxWidgets
 Eclipse, veel gebruikt voor Java, maar met goede ondersteuning voor C++ via de CDT plugin
 Xcode (Mac OS) IDE met onder andere ondersteuning voor C++
 NetBeans (Windows, Linux, Mac OS en Solaris)
 CodeLite (Windows, Linux en Mac OS)
 CLion (Windows, Linux en Mac OS)
 C++Builder (Windows)

C++-voorbeelden 
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 <iostream>
#include <iterator>
#include <vector>
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 
 Lijst van programmeertalen

Voetnoten