# C++

C++ és un llenguatge de programació que fou creat, com el seu predecessor C, als laboratoris Bell (no confondre amb Graham Bell) de AT&T. L'autor principal n'és Bjarne Stroustrup. L'any 1980 s'hi van afegir noves característiques, entre les principals la integració de les classes, idea que va ser presa de Simula67, per molts considerat el primer llenguatge orientat a objectes. A partir d'aquí va evolucionar fins que l'any 1985 va ser consolidat com un llenguatge orientat a objectes i anomenat C++.
Actualment existeix un estàndard, anomenat ISO C++, al qual s'han adherit la majoria dels fabricants de compiladors més moderns. N'existeixen també alguns intèrprets, com ara ROOT.
Una particularitat del C++ és la possibilitat de redefinir els operadors (sobrecàrrega d'operadors), i de poder crear nous tipus que es comportin com tipus fonamentals.
El nom C++ va ser proposat per Rick Mascitti l'any 1983, quan el llenguatge va ser utilitzat per primera vegada fora d'un laboratori científic. Abans s'havia fet servir el nom "C amb classes". C++ significa increment de C i es refereix al fet que C++ és una extensió de C, però que manté la compatibilitat històrica amb el llenguatge C.

## Característiques de C++

Algunes de les principals característiques del llenguatge són:
* La seva sintaxi és heretada del llenguatge C.
* Programa orientat a objectes (POO).
* Permet l'agrupació d'instruccions.
* Llenguatge molt didàctic, amb aquest llenguatge pots aprendre molts altres llenguatges amb gran facilitat.
* És portàtil i té un gran nombre de compiladors en diferents plataformes i sistemes operatius.
* Permet la separació d'un programa en mòduls que admeten compilació independent.
* És un llenguatge d'alt nivell.

## Programa d'exemple (clàssic Hola món!)

Aquest programa escriu "Hola món" al dispositiu de sortida de defecte (habitualment el monitor),
Per als usuaris de Windows, per a poder visualitzar Hola, món!, hauran d'afegir
o
abans del
En utilitzar la directiva #include estem dient-li al compilador que busqui determinades coses en un arxiu que es diu iostream. Per evitar redefinir coses ja fetes al posar-los igual nom, es va crear una cosa anomenada espais de nom del namespace en el singular de l'anglès. En aquest cas hi ha un espai de noms anomenat std, que és on s'inclouen les definicions de totes les funcions i classes que conformen la llibreria estàndard de C++, entre moltes altres coses de l'objecte cout, que representa el flux de sortida estàndard (típicament la pantalla o una finestra de text), i tot això és exactament el que diem en afegir la sentència using namespace std.
La definició de funcions és igual que a C, excepte per la característica que si el main no ha de recollir arguments, no tenim per què posar-los, a diferència de C, on calia posar-los explícitament, encara que no s'anessin a utilitzar. Queda només comentar que el símbol << es coneix com a operador d'inserció, i grosso modo està enviant a cout el que volem mostrar per pantalla perquè el pinti, en aquest cas la cadena "Hola, món!". El mateix operador << es pot usar diverses vegades en la mateixa sentència, de manera que gràcies a aquesta característica podem posar un caràcter endl al final, que és l'equivalent del \n o \r\n (segons el sistema en què s'estigui programant) del llenguatge de programació C.

## Tipus de dades

C++ té els següents tipus fonamentals:
* Caràcters: char (també és un enter), wchar_t
* Enters: short int, int, long int, long long int
* Nombres de coma flotant: float, double, long double
* Booleans: bool (cert o fals)
* Buit: void

## Mides associats

Segons la màquina i el compilador que s'utilitzi els tipus primitius poden ocupar una determinada mida a la memòria. La següent llista il·lustra el nombre de bits que ocupen els diferents tipus primitius l'arquitectura x86. Mides de tipus primitius sota i386 (GCC) Tipus Nombre de Bits
* char 8
* short 16
* int 32
* float 32
* double 64
Altres arquitectures poden requerir diferents mides de tipus de dades primitius. C++ no diu res sobre quin és el nombre de bits en un byte, ni de la mida d'aquests tipus, més aviat, ofereix només les "garanties de tipus":
* Un tipus char té la mida mínima en bytes assignable per la màquina, i tots els bits d'aquest espai han de ser "accessibles".
* La mida reconegut de char és d'1. És a dir, sizeof(char) sempre torna 1.
* Un tipus short té almenys la mateixa mida que un tipus char.
* Un tipus long té almenys el doble mida en bytes que un tipus short.
* Un tipus int té una mida entre el de short i el de long, ambdós inclosos, preferentment la mida d'un apuntador de memòria de la màquina.
* Un tipus unsigned té la mateixa mida que la seva versió signed.

### wchar_t

Per a la versió de l'estàndard que es va publicar el 1998, es va decidir afegir el tipus de dada wchar_t, que permet l'ús de caràcters Unicode, a diferència del tradicional char, que contempla simplement al codi de caràcters ASCII estès. Al seu torn, s'ha definit per a la majoria de les funcions i classes, tant de C com de C++, una versió per treballar amb wchar_t, on usualment es prefixa el caràcter w al nom de la funció (de vegades el caràcter és un prefix). Per exemple:
* strcpy - wstrcpy
* std::string - std::wstring
* std::cout - std::wcout
Cal ressaltar que a C es defineix wchar_t com:
Mentre que en C++ és en si mateix un tipus de dada.

## La paraula clau "void"

La paraula clau void defineix en C++ el concepte de la no existència o no atribució d'un tipus en una variable o declaració. Com a tal, pot ser usada per destacar que una funció no rep paràmetres, com en:
Tot i que la tendència actual és la de no posar la paraula "void". A més s'utilitza per determinar que una funció no retorna un valor (en l'anterior s'espera que retorni un valor tipus int), com a:
Cal destacar que void no és un tipus. Una funció com la declarada anteriorment no pot retornar un valor per mitjà de return: la paraula clau va sola. No és possible una declaració del tipus:
En aquest sentit, void es comporta de forma lleugerament diferent a com ho fa en C, especialment pel que fa al seu significat en declaracions i prototips de funcions. No obstant això, la forma especial void * indica que el tipus de dades és un punter. Per exemple:
Indica que memòria és un punter a algun lloc, on es guarda informació d'algun tipus. El programador és responsable de definir aquests "algun", eliminant tota ambigüitat. Un avantatge de la declaració "void *" és que pot representar alhora diversos tipus de dades, depenent de l'operació de cast escollida. La memòria que hem apuntat en algun lloc, en l'exemple anterior, bé podria emmagatzemar un sencer, un flotant, una cadena de text o un programa, o combinacions d'aquests. És responsabilitat del programador recordar quin tipus de dades hi ha i garantir l'accés adequat.

## Principis

Tot programa en C++ ha de tenir la funció main (llevat que s'especifiqui en temps de compilació un altre punt d'entrada, que en realitat és la funció que té el main)
La funció main ha de tenir un dels següents prototips:
* int main
* int main (int argc, char ** argv)
* int main (int argc, char ** argv, char ** env)
La primera és la forma per omissió d'un programa que no rep paràmetres ni arguments. La segona forma té dos paràmetres: argc, un nombre que descriu el nombre d'arguments del programa (incloent-hi el nom del programa mateix), i argv, un punter a una matriu de punters, de argc elements, on l'element argv [i] representa l'últim argument lliurat al programa. En el tercer cas s'afegeix la possibilitat de poder accedir a les variables d'entorn d'execució de la mateixa manera que s'accedeix als arguments del programa, però reflectits sobre la variable env.
El tipus de retorn de main és int. En acabar la funció main, s'ha d'incloure el valor de retorn (per exemple, return 0;, encara que l'estàndard preveu només dos possibles valors de retorn: EXIT_SUCCESS i EXIT_ERROR, definides en l'arxiu cstddef), o sortir per mitjà de la funció exit. Alternativament es pot deixar en blanc, en aquest cas el compilador és responsable d'afegir la sortida adequada.

## El concepte de classe

Vegeu també: Classe (informàtica)
Els objectes en C++ són abstrets mitjançant una classe. Segons el paradigma de la programació orientada a objectes un objecte consta de:
* Mètodes o funcions
* Atributs o Variables Membre
Un exemple de classe que podem explicar com a exemple és la classe gos. Cada gos comparteix unes característiques (atributs). El seu nombre de potes, el color del seu pelatge o la seva mida són alguns dels seus atributs. Les funcions que ho facin bordar, canviar el seu comportament... aquestes són les funcions de la classe.
Aquest és un altre exemple d'una classe:

## Herència

Vegeu també: Herència (programació).
Existeixen dos tipus d'herència entre classes en el llenguatge de programació C++. Aquestes són:
* Herència simple (un sol pare)
* Herència múltiple (més d'un pare)

## Sobrecàrrega d'operadors

La sobrecàrrega d'operadors és una forma de fer polimorfisme. És possible definir el comportament d'un operador del llenguatge perquè treballi amb tipus de dades definits per l'usuari. No tots els operadors de C++ són factibles de sobrecarregar, i, entre aquells que poden ser sobrecarregats, s'han de complir condicions especials. En particular, els operadors sizeof i:: no són sobrecàrregues.
No és possible en C++ crear un operador nou.
Els comportaments dels operadors sobrecarregats s'implementen de la mateixa manera que una funció, llevat que aquesta tindrà un nom especial: Tipus de dades de tornada operator<token del operador> (paràmetres)

### Els següents operadors poden ser sobrecarregats

* Operadors unaris
** Operador * (d'indirecció)
** Operador -> (d'indirecció)
** Operador +
** Operador -
** Operador ++
** Operador --
* Operadores Binaris
** Operador ==
** Operador +
** Operador -
** Operador *
** Operador /
** Operador %
** Operador <<
** Operador >>
** Operador &
** Operador ^
** Operador |
** Operador
** Operador
* Operadors d'Assignació
** Operador =
** Operador +=
** Operador -=
** Operador *=
** Operador /=
** Operador %=
** Operador <<=
** Operador >>=
** Operador &=
** Operador ^=
** Operador |=
Atès que aquests operadors són definits per un tipus de dades definit per l'usuari, aquest és lliure d'assignar qualsevol semàntica que desitgi. No obstant això, es considera de primera importància que les semàntiques siguin tan semblants al comportament natural dels operadors com perquè l'ús dels operadors sobrecarregats sigui intuïtiu. Per exemple, l'ús de l'operador unari - hauria canviar el "signe" d'un "valor".
Els operadors sobrecarregats no deixen de ser funcions, i per això poden retornar un valor, si aquest valor és del tipus de dades amb què treballa l'operador, permet l'encadenament de sentències. Per exemple, si tenim 3 variables A, B i C d'un tipus T i sobrecarreguem l'operador = perquè treballi amb el tipus de dades T, hi ha dues opcions: si l'operador no torna res una sentència com "A = B = C, "(sense les cometes) donaria error, però si es torna un tipus de dades T a l'implementar l'operador, permetria concatenar tots els elements es volguessin, permetent alguna cosa com" A = B = C = D =...;"

## Diferències de tipus respecte a C

En C++, qualsevol tipus de dades que sigui declarat complet (fully qualified, en anglès) es converteix en un tipus de dades únic. Les condicions perquè un tipus de dades T sigui declarat complet són a grans trets les següents:
* És possible al moment de compilació conèixer l'espai associat al tipus de dades (és a dir, el compilador ha de conèixer el resultat de sizeof(T)).
* T Té almenys un constructor, i un destructor, ben declarats.
* Si T és un tipus compost, o és una classe derivada, o és l'especificació d'una plantilla, o qualsevol combinació de les anteriors, llavors les dues condicions establertes prèviament han d'aplicar per a cada tipus de dada constituent.
En general, això significa que qualsevol tipus de dades definit fent ús de les capçaleres completes, és un tipus de dades complet.
En particular, i, a diferència del que ocorria en C, els tipus definits per mitjà de struct o enum són tipus complets. Com a tals, ara són subjectes a sobrecàrrega, conversions implícites, etcètera.
Els tipus enumerats, llavors, ja no són simplement àlies per a tipus sencers, sinó que són tipus de dades úniques en C++. El tipus de dades bool, igualment, passa a ser un tipus de dades únic, mentre que en C funcionava en alguns casos com un àlies per a alguna classe de dada de tipus sencer.

## Compiladors

Un dels compiladors lliures de C++ és el de GNU, el compilador G++ (part del projecte GCC, que engloba diversos compiladors per a diferents llenguatges). Altres compiladors comuns són Intel C++ Compiler, el compilador de Xcode, el compilador de Borland C++, el compilador de CodeWarrior C++, el compilador g++ de Cygwin, el compilador g++ de MinGW, el compilador de Visual C++, Carbide.c++, entre d'altres.

## Biblioteques

* Standard Template Library

## Referències

* 1 2 3 4 5 «C++». Gran Enciclopèdia Catalana. [Consulta: 13 agost 2022].
* ↑ Stroustrup, Bjarne. «1». A: The C++ Programming Language. Third, 1997. ISBN 0-201-88954-4. OCLC 59193992.
* ↑ Error: hi ha títol o url, però calen tots dos paràmetres.«» (en anglès).

## Vegeu també

* Notepad++.
* Festival (TTS).
* Llibreria d'algoritmes de geometria computacional
Altres llenguatges de programació:
* C
* C#
* Java
* Vala
* Pascal
* Objective-C
* Python