C++

De Viquipèdia
Dreceres ràpides: navegació, cerca
C++
C++
Paradigma de programació: multi-paradigma: orientat a objectes, programació funcional, programació genèrica.
Aparegut l'any: 1983
Desenvolupador: Bjarne Stroustrup
Bell Labs
ISO/IEC JTC1/SC22/WG21
Darrera versió estable: ISO/IEC 14882:2003 (2003)
Tipus de dades: fort, estàtic
Dialectes: ISO/IEC C++ 1998,
ISO/IEC C++ 2003
Ha influenciat: Perl, LPC, Lua, Pike, Ada 95, Java, PHP, D, C99, C#
Sistema operatiu: multiplataforma

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. El seu autor principal va ser Bjarne Stroustrup. L'any 1980 es van afegir noves característiques al llenguatge C, 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 anar evolucionant fins que a 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". En C++, l'expressió "C++" significa "increment de C" i es refereix al fet que C++ és una extensió de C.

Programa d'exemple (clàssic Hola món!)[modifica | modifica el codi]

Aquest programa escriu "Hola món" al dispositiu de sortida de defecte (habitualment el monitor),

#include <iostream>
 
using namespace std;
 
int main()
{
 cout << "Hola, món!" << endl;
 return 0;
}

Per als usuaris de Windows, per a poder visualitzar Hola, món!, hauran d'afegir

 system("PAUSE"); 
 o 
 getchar();

abans del

 return 0;

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 del llenguatge C o \n\r, segons el sistema en què s'estigui programant.

Tipus de dades[modifica | modifica el codi]

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[modifica | modifica el codi]

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 de 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[modifica | modifica el codi]

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:

typedef unsigned short wchar_t;

Mentre que en C++ és en si mateix un tipus de dada.

La paraula clau "void"[modifica | modifica el codi]

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:

int funció (void);

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:

void funcio (int parametre);

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:

void t; / / Està malament

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:

void * memòria;

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[modifica | modifica el codi]

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() )

 int 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[modifica | modifica el codi]

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:

 class Punt
 {
 // Per defecte els membres d'una classe són 'private' perquè només es puguin modificar des de la pròpia classe.
 private: 
 // Variable membre privada [només hi pot accedir ella mateixa(la classe)]
 int id;
 protected:
 // Variables membre protegides (Hi poden accedir tant ella mateixa com les classes filles
 int x;
 int i;
 public: //Hi pot accedir tothom
 // Constructor
 Punt ();
 // Destructor
 ~ Punt ();
 // Funcions membre o mètodes
 int ObtenerX ();
 int ObtenerY ();
 };

Herència[modifica | modifica el codi]

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[modifica | modifica el codi]

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 ()
  • Operadores de 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, pel que 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 =...;"

Biblioteques[modifica | modifica el codi]

  • Standard Template Library[1]

Vegeu també[modifica | modifica el codi]

Altres llenguatges de programació:

Referències[modifica | modifica el codi]

A Wikimedia Commons hi ha contingut multimèdia relatiu a: C++ Modifica l'enllaç a Wikidata
  1. C++ Standard Template Library(anglès)