Diferencies ente revisiones de «C++»

Contenido eliminado Contenido añadido
Sin resumen de edición
Xqbot (alderique | contribuciones)
m Bot: Reemplace la etiqueta obsoleta <source> y el parámetro "enclose"; cambios cosméticos
Llinia 83:
Cabo resaltar qu'en C se define <code>wchar_t</code> como:
 
<sourcesyntaxhighlight lang="cpp">
typedef unsigned short wchar_t;
</syntaxhighlight>
</source>
 
Ente qu'en C++ ye en sí mesmu un tipu de datu.
Llinia 93:
La pallabra reservada <code>void</code> define en C++ el conceutu de non esistencia o non atribución d'un tipu nuna variable o declaración. Esto ye, una función declarada como <code>void</code> nun va devolver nengún valor. Esta pallabra reservada tamién puede usase pa indicar qu'una función nun recibe parámetros, como na siguiente declaración:
 
<sourcesyntaxhighlight lang="cpp">
int funcion (void);
</syntaxhighlight>
</source>
Anque l'enclín actual ye la de nun asitiar la pallabra "void".
 
Amás utilízase pa determinar qu'una función nun retorna un valor, como en:
<sourcesyntaxhighlight lang="cpp">
void funcion (int parametro);
</syntaxhighlight>
</source>
 
Cabo destacar que '''<code>void</code> nun ye un tipu'''. Una función como la declarada enantes nun puede retornar un valor per mediu de <tt>return</tt>: la pallabra clave va sola. Nun ye posible una declaración del tipu:
<sourcesyntaxhighlight lang="cpp">
void t; //Ta mal
</syntaxhighlight>
</source>
 
Nesti sentíu, <code>void</code> portar de forma llixeramente distinta a como lo fai en C, especialmente tocantes al so significáu en declaraciones y prototipos de funciones.
Llinia 112:
Sicasí, la forma especial <tt>void *</tt> indica que'l tipu de datos ye un punteru. Por casu:
 
<sourcesyntaxhighlight lang="cpp">
void *memoria;
</syntaxhighlight>
</source>
 
Indica que <tt>memoria</tt> ye un punteru a ''dalguna parte'', onde se guarda información de ''dalgún tipu''. El [[programador]] ye responsable de definir estos "dalgún", esaniciando toa ambigüedá. Una ventaya de la declaración "''void *''" ye que puede representar al empar dellos tipos de datos, dependiendo de la [[Conversión de tipo|operación de ''cast'']] escoyida. La memoria qu'apuntemos ayundes, nel exemplu anterior, bien podría almacenar un enteru, un flotante, una cadena de testu o un programa, o combinaciones d'estos. Ye responsabilidá del programador recordar qué tipu de datos hai y garantizar l'accesu fayadizu.
Llinia 124:
Tenemos entós que:
 
<sourcesyntaxhighlight lang="cpp">
void* piqueru = NULL;
int enteru = NULL;
bool boleana = NULL;
char caracter = NULL;
</syntaxhighlight>
</source>
 
El valor de les variables anteriores daríanos 0. A diferencia de la variable "caracter", que nos daría l'equivalente a NULL, '\0', pa calteres.
Llinia 136:
 
Tou programa en C++ tien de tener la función principal <code>main()</code> (sacantes que se especifique en tiempu de compilación otru puntu d'entrada, qu'en realidá ye la función que tien el <code>main()</code>)
<sourcesyntaxhighlight lang="cpp">
int main()
{}
</syntaxhighlight>
</source>
 
La función principal del códigu fonte <tt>main</tt> tien de tener unu de los siguientes prototipos:<br />
Llinia 166:
Este ye otru exemplu d'una clase:
 
<sourcesyntaxhighlight lang="cpp">
class Puntu {
 
Llinia 186:
int ObtenerY();
};
</syntaxhighlight>
</source>
 
=== Constructores ===
Llinia 202:
 
 
<sourcesyntaxhighlight lang="cpp">
class Puntu {
 
Llinia 229:
return 0;
}
</syntaxhighlight>
</source>
 
Si compilamos y executamos l'anterior programa, llogramos una salida que tien de ser similar a la siguiente:
Llinia 245:
Un oxetu creáu de la forma que se vio hasta agora, ye un oxetu que vive dientro del scope(les llaves { }) nel que foi creáu. Por que un oxetu pueda siguir viviendo cuando se saque del scope nel que se creó, tien de crear en memoria heap. Pa esto, utilízase l'operador new, que asigna memoria p'almacenar al oxetu creáu, y amás llama al so constructor(polo que se-y pueden unviar parámetros). L'operador new utilizar de la siguiente manera:
 
<sourcesyntaxhighlight lang="cpp">
int main() {
Puntu *unPunto = new Puntu(); //esto llapada al constructor que se describe más arriba
Llinia 251:
return 0;
}
</syntaxhighlight>
</source>
 
Amás, col operador new[] pueden crease arrays (colecciones o llistes ordenaes) de tamañu dinámicu:
 
<sourcesyntaxhighlight lang="cpp">
Puntu *asignar(int cuantos) {
return new Puntu[cuantos]; //asigna un array de 'cuantos' puntos(llámase'l constructor que s'amuesa más arriba), y retornar.
}
</syntaxhighlight>
</source>
 
=== Destructores ===
Llinia 271:
Los destructores son invocaos automáticamente al algamar el fluxu del programa'l fin del ámbitu nel que ta declaráu l'oxetu. L'únicu casu nel que se debe '''invocar explícitamente al destructor d'un oxetu''', ye cuando esti foi creáu por aciu l'operador new, esto ye, qu'esti vive en memoria heap, y non na pila d'execución del programa. La invocación del destructor d'un oxetu que vive en heap realízase al traviés del operador delete o delete[] pa arrays. Exemplu:
 
<sourcesyntaxhighlight lang="cpp">
int main() {
int *unEntero = new int(12); //asignamos un enteru en memoria heap col valor 12
Llinia 279:
return 0;
}
</syntaxhighlight>
</source>
 
Si nun s'utilizara l'operador delete y delete[] nesi casu, la memoria ocupada por unEntero y arrayDeEnteros respeutivamente, quedaría ocupada ensin sentíu. Cuando una porción de memoria queda ocupada por una variable que yá non s'utiliza, y nun hai forma d'aportar a ella, denominar un 'memory leak'. N'aplicaciones grandes, si asoceden munchos memory leaks, el programa puede terminar ocupando abondo más memoria RAM de la que debería, lo que nun ye pa nada conveniente. Ye por esto, que'l manexu de memoria heap tien d'usase conscientemente.
Llinia 305:
Por casu:
 
<sourcesyntaxhighlight lang="cpp">
template <typename T>
T max(const T &x, const T &y) {
return (x > y) ? x : y; //si x > y, retorna x, sinón retorna y }
 
</syntaxhighlight>
</source>
 
La función <tt>max()</tt> ye un exemplu de programación xenérica, y daos dos parámetros d'un tipu T (que puede ser <tt>int</tt>, <tt>long</tt>, <tt>float</tt>, <tt>double</tt>, etc.) va devolver el mayor d'ellos (usando l'operador <tt>></tt>). Al executar la función con parámetros d'un ciertu tipu, el compilador va intentar "calzar" la plantía a esi tipu de datos, o bien va xenerar un mensaxe d'error si fracasa nesi procesu.
Llinia 318:
El siguiente exemplu:
 
<sourcesyntaxhighlight lang="cpp">
template <typename A> int myfunction(A a);
</syntaxhighlight>
</source>
 
crea una plantía so la cual pueden ser definíes nel códigu de cabecera cualesquier funciones especializaes pa un tipu de datos como <tt>int myfunction(int), int myfunction(std::string), int myfunction(bool)</tt>, etcétera:
 
<sourcesyntaxhighlight lang="cpp">
int myfunction (int a) {
return a + 5;
Llinia 336:
return (a & rand()); //Si a ye verdaderu, devuelve un númberu aleatoriu; en casu contrariu devuelve 0
};
</syntaxhighlight>
</source>
 
Caúna d'estes funciones tien la so propia definición (cuerpu). Cada cuerpu distintu, non equivalente ("non convertible") correspuende a una '''especialización'''. Si una d'estes funciones nun fuera definida, el compilador va tratar d'aplicar les conversiones de tipos de datos que-y fueren dexaes pa "calzar" una de les plantíes, o va xenerar un mensaxe d'error si fracasa nesi procesu.
Llinia 350:
En C++ los métodos de les clases astractes defínense como [[función virtual|funciones virtuales]] pures.
 
<sourcesyntaxhighlight lang="cpp">
class Astracta {
 
Llinia 376:
}
};
</syntaxhighlight>
</source>
Nel exemplu, la clase <tt>ConcretaA</tt> ye una implementación de la clase <tt>Astracta</tt>, y la clase <tt>ConcretaB</tt> ye otra implementación.
Tien De notase qu'el <tt>= 0</tt> ye la notación qu'emplega C++ pa definir funciones virtuales pures.
Llinia 388:
Por casu:
 
<sourcesyntaxhighlight lang="cpp">
# include <iostream>
// Les funciones nesta cabecera esisten dientro del espaciu de nomes std::
Llinia 406:
return 0;
}
</syntaxhighlight>
</source>
 
Como puede trate, les invocaciones direutes a ''el mio_valor'' van dar accesu solamente a la variable descrita llocalmente; p'aportar a la variable del espaciu de nomes ''el mio_paquete'' ye necesariu aportar específicamente l'espaciu de nomes. Un atayu encamentáu pa programes senciellos ye la direutiva <tt>using namespace</tt>, que dexa aportar a los nomes de variables del paquete deseyáu en forma direuta, siempres y cuando nun se produza dalguna ambigüedá o conflictu de nomes.
Llinia 426:
 
Nesti exemplu tendríamos les coses xenerales d'un Barcu (en C++)
<sourcesyntaxhighlight lang="cpp">
class Barcu {
protected:
Llinia 434:
//Constructores y demás funciones básiques de barcu };
 
</syntaxhighlight>
</source>
y agora les carauterístiques de les clases derivaes, podríen (al empar qu'herieden les de barcu) añedir coses propies del subtipo de barcu que vamos crear, por casu:
 
<sourcesyntaxhighlight lang="cpp">
class Cargueru: public Barcu { // Esta ye la manera d'especificar qu'herieda de Barcu private:
Llinia 450:
// El restu de coses
};
</syntaxhighlight>
</source>
 
A lo último, hai que mentar qu'esisten 3 clases d'heriedu que s'estremen na manera de remanar la visibilidá de los componentes de la clase resultante:
Llinia 463:
Cuando ves a quien te atiende nuna tienda, como persona que ye, vas poder suponer que puede falar, comer, andar, pero, per otru llau, como emplegáu que ye, tamién vas poder suponer que tien un xefe, que puede cobrate dineru pola compra, que puede devolvete'l cambéu, etc. Si esto treslladar a la programación sería heriedu múltiple (clase emplegáu_tienda):
 
<sourcesyntaxhighlight lang="cpp">
class Persona {
...
Llinia 484:
...
};
</syntaxhighlight>
</source>
 
Por tanto, ye posible utilizar más d'una clase por qu'otra heriede les sos carauterístiques.
Llinia 510:
** Operador +
** Operador -
** Operador
* ** Operador /
** Operador %
Llinia 547:
Estes clases tienen sobrecargados el operadores << y >>, respeutivamente, al envís de ser útiles nel insertamientu/estracción de datos a dichos fluxos. Son operadores intelixentes, yá que son capaces d'afaese al tipu de datos que reciben, anque vamos tener que definir el comportamientu de felicidá entrada/salida pa clases/tipo de datos definíos pol usuariu. Por casu:
 
<sourcesyntaxhighlight lang="cpp">
ostream& operator<<(ostream& fs, const Puntu& puntu)
{
return fs << puntu.x << "," << puntu.y;
}
</syntaxhighlight>
</source>
 
D'esta forma, p'amosar un puntu, solo habría que realizar la siguiente espresión:
<sourcesyntaxhighlight lang="cpp">
//...
Puntu p(4,5);
Llinia 561:
cout << "Les coordenaes son: " << p << endl;
//...
</syntaxhighlight>
</source>
 
Ye posible formatear la entrada salida, indicando'l númberu de díxitos decimales a amosar, si los testos van pasar a minúscules o mayúscules, si los númberos recibíos tán en formatu [[sistema octal|octal]] o [[sistema hexadecimal|hexadecimal]], etc.
Llinia 585:
Lleer un ficheru:
1-Si ye ficheru de testu planu:
<sourcesyntaxhighlight lang='cpp'>
#include <fstream>
#include <string>
Llinia 600:
return 0;
}
</sourcesyntaxhighlight>
 
2-Si ye un ficheru binariu(.dat);
Llinia 629:
Exemplos:
 
<sourcesyntaxhighlight lang="cpp">
ostringstream s;
s << nome << "," << edá << "," << estatura << "," << puntu(5,6) << endl;
Llinia 635:
istringstream s(cadena);
s >> nome >> edá >> estatura >> p;
</syntaxhighlight>
</source>
 
=== Contenedores ===
Llinia 643:
* Vectores: Definir por <pre>vector<tipu_de_datu> nome_del vector;</pre> Son arrays (o llistes ordenaes) que se redimensionan automáticamente al amestar nuevos elementos, polo que se-y pueden amestar "teóricamente", infinitos elementos. Los vectores déxennos aportar a cualquier elementu que contenga, por aciu l'operador[]. Tien De tenese en cuenta que si s'intenta aportar a una posición qu'entepasa les llendes del vector, esti nun va faer nengún chequeo, polo que se debe ser cuidadosu al utilizar esti operador. P'asegurar un accesu seguru al vector, puede utilizase el métodu at(int), que llanza una esceición de tipu std::out_of_range en casu de qu'esto asoceda.
P'añedir elementos a la fin del vector, utilízase'l métodu push_back(const T&). Per otru llau, pa esaniciar un elementu del final del vector, tien d'usase'l métodu pop_back().
<sourcesyntaxhighlight lang="cpp">
#include <vector> //llibrería que contién a la clase vector
#include <iostream>
Llinia 661:
return 0;
}
</syntaxhighlight>
</source>
* Coles dobles: son paecíes a los vectores, pero tienen meyor eficiencia p'amestar o esaniciar elementos nes "puntes".<pre>deque<tipu_de_datu> nome_de_la cola;</pre>
Amás de los métodos push_back(const T&) y pop_back(), amiéstense los métodos push_front(const T&) y pop_front(), que realicen lo mesmo que los yá esplicaos, pero nel empiezu de la cola.
 
<sourcesyntaxhighlight lang="cpp">
#include <deque> //llibrería de deques
 
Llinia 678:
return 0;
}
</syntaxhighlight>
</source>
* Llistes: Son eficientes a la d'amestar elementos. La diferencia coles coles dobles, ye que son más eficientes pa esaniciar elementos que nun tean en dalguna de les "puntes"<pre>list<tipu_de_datu> nome_de_la llista;</pre>
* Adaptadores de secuencia.
Llinia 686:
</pre>
 
<sourcesyntaxhighlight lang="cpp">
#include <map> //llibrería que contién a map y multimap
#include <string> //llibrería de strings
Llinia 701:
return 0;
}
</syntaxhighlight>
</source>
* Contenedores asociativos: set y multiset, qu'ufierten solamente la condición de "pertenencia", ensin la necesidá de garantizar un ordenamientu particular de los elementos que contienen.
 
Llinia 717:
Un algoritmu bien importante que vien implementáu na biblioteca STL, ye'l sort. L'algoritmu sort, ordena cualquier tipu de contenedor, siempres y cuando se-y pasen como argumentos, dende onde y hasta onde quier ordenar lo.
 
<sourcesyntaxhighlight lang='cpp'>
#include <vector>
#include <deque>
Llinia 730:
/*Notar que si en cuenta de un vector, fuera una deque, ordenar de la mesma manera. */
}
</syntaxhighlight>
</source>
 
Ente les funciones más conocíes tán <tt>swap (variable1, variable2)</tt>, qu'a cencielles intercambia los valores de variable1 y variable2; <tt>max (variable1, variable2)</tt> y el so símil <tt>min (variable1, variable2)</tt>, que retornen el máximu o mínimu ente dos valores; <tt>find (entamu, fin, valor)</tt> que busca valor nel espaciu de variables ente entamu y fin; etcétera.
Llinia 781:
=== Usu ===
 
<sourcesyntaxhighlight lang="cpp">
#include <cstdlib>
using namespace std;
Llinia 787:
system("color 45");
 
</syntaxhighlight>
</source>
 
Nesti casu definióse'l fondu de pantalla de color coloráu y les lletres rosadas.
Llinia 803:
* [[wxDev-C++]]
* [[Zinjai]]
* [[Watcom#Open_WatcomOpen Watcom|Open Watcom (IDE y Dialog Editor)]]
* [[CodeLite]]
 
Llinia 826:
* [[Zinjai]]
* [[Kdevelop]]
* [[Watcom#Open_WatcomOpen Watcom|Open Watcom (IDE y Dialog Editor)]]
* [[CodeLite]]
* [[Clion (software)]]
Llinia 836:
Pa evitar los problemes qu'esisten en C ++, y p'aumentar la productividá,<ref>[https://www.technologyreview.com/s/419956/new-languages-and-why-we-need-them/ New Languages, and Why We Need Them], [[MIT Technology Review]]</ref> delles persones suxuren llinguaxes alternativos más recién que C ++, como [[D (llinguaxe de programación)|D]], [[Go (llinguaxe de programación)|Go]], [[Rust (llinguaxe de programación)|Rust]] y [[Vala (llinguaxe de programación)|Vala]].<ref>[http://www.drdobbs.com/architecture-and-design/the-new-native-languages/232901652 The New Native Languages | Dr Dobb's]</ref>
 
== Ver tamién ==
 
* [[A++]]