Este texto muestra y pone de relieve caracter�sticas y b�sico principios de C + +. Lo est� dirigido a usuarios con experiencia en C que quieren aprender C + +. Usted ser capaz de expresar su co mediante las m�s ricas C + + la sintaxis y la usted ser� capaz de leer un poco de C + + cdigo.
Aunque el concepto se introduce y se volvieron, esta no es una tutorial sobre programacin orientada a objetos. Usted todav�a tiene que aprender el esp�ritu de la programaci�n orientada a objetos y los detalles de su implementacin C + +, con el fin de ser un verdadero C + + programador.
Para compilar el archivo de c�digo fuente, escriba el siguiente comando (en la mayor�a de
de c�digo abierto de Unix-como las cajas) en una ventana de la consola o terminal:
archivo de c�digo fuente, lo que necesita para compilarlo de nuevo si desea que el
modificaciones que se refleja en el margen TEST01
archivo ejecutable (escriba la tecla de flecha del teclado para recordar
comandos).
Las referencias se pueden utilizar para permitir a una funci�n modificar una llamada
variable:
Si est� acostumbrado a los punteros en C y se preguntan c�mo exactamente el programa
por encima de las obras, as� es como el compilador de C + + que se traducen en C:
Una referencia puede ser utilizado para permitir que una funci�n devuelve una variable:
Una vez m�s, a condici�n de que usted est� acostumbrado a la aritm�tica de punteros y si
se preguntan c�mo el programa anterior funciona, basta con imaginar que el compilador
como si las referencias son �tiles para las variables con eficacia sin puntero.
considera una mala pr�ctica. Usted puede meterse en problemas. V�ase, por ejemplo
Si su canci�n usando namespace std;
# include
doble silly_function * ()
style = "color: rgb (153, 153, 153 );">// Esta funci�n devuelve un puntero a una doble
{static double r = 342; volver
& r ;}
int main () {
doble * a;
un silly_function = ();
style = "color: rgb (255, 0, 0);"> doble y b = * a,
style = "color: rgb (153, 153, 153 );">// Ahora b
style = "color: rgb (255, 102, 102);"> es
style = "color: rgb (153, 153, 153);"> la doble direcci�n que apunta
b + = 1;
style = "color: rgb (153, 153, 153 );">// Gran
b = b * b,
style = "color: rgb (153, 153, 153 );">// No hay necesidad de escribir * a todo el mundo
b + = 4;
cout <<" contenido de * a, b, r: "< volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| contenido de * a, b, r: 117653
|
9.
Los espacios de nombres se pueden declarar.
Las variables declaradas dentro de un espacio de nombres se pueden utilizar gracias a la ::
operador:
Si su canci�n usando namespace std;
# include # include
espacio de nombres de primera
{int a;
int b;
}
segundo espacio de nombres
{
un doble, doble
b;}
int main () {
primero: : a = 2;
primero:: b = 5;
segundo: a = 6,453;
segundo: b = 4.1e4;
cout << primero: un segundo +:: a < cout <
volver
0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| 8.453
41005
|
10.
Si una funci�n contiene las l�neas simples de c�digo, no utiliza margen de
bucles o similares, puede ser declarado en l�nea . Este
significa que el c�digo se insertar� en todas partes la funci�n es
utilizados. Eso es algo as� como una macro. La principal ventaja es el programa
voluntad
ser m�s r�pido. Un peque�o inconveniente es que ser� m�s grande, ya que el total
c�digo de la funci�n se introdujo en todas partes
se utiliza:
using namespace std;
#include <iostream>
#include <cmath>
style="color: rgb(255, 0, 0);">inline double hypothenuse (double a, double b)
style="color: rgb(255, 0, 0);">{
style="color: rgb(255, 0, 0);"> return sqrt (a * a + b * b);
style="color: rgb(255, 0, 0);">}
int main ()
{
double k = 6, m = 9;
style="color: rgb(153, 153, 153);">// Next two lines produce exactly the same code:
cout <<
style="color: rgb(255, 0, 0);">hypothenuse (k, m) << endl;
cout << sqrt (k * k + m * m) << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| 10,8167
10.8167
|
(Las funciones en l�nea se han a�adido a la C en el C99
y ANSI C 2000).
11.
Usted sabe las estructuras de control cl�sico de C: de , si ,
hacer , mientras que , interruptor ... C + + a�ade un control m�s
estructura
excepci�n nombrada:
using namespace std;
#include <iostream>
#include <cmath>
int main ()
{
int a, b;
cout << "Type a number: ";
cin >> a;
cout << endl;
style="color: rgb(255, 0, 0);">try
style="color: rgb(255, 0, 0);"> {
style="color: rgb(255, 0, 0);"> if (a > 100) throw 100;
style="color: rgb(255, 0, 0);"> if (a < 10) throw 10;
style="color: rgb(255, 0, 0);"> throw a / 3;
style="color: rgb(255, 0, 0);"> }
style="color: rgb(255, 0, 0);"> catch (int result)
style="color: rgb(255, 0, 0);"> {
style="color: rgb(255, 0, 0);"> cout << "Result is: " << result << endl;
style="color: rgb(255, 0, 0);"> b = result + 1;
style="color: rgb(255, 0, 0);"> }
cout << "b contains: " << b << endl;
cout << endl;
style="color: rgb(153, 153, 153);">// another example of exception use:
char zero [] = "zero";
char pair [] = "pair";
char notprime [] = "not prime";
char prime [] = "prime";
style="color: rgb(255, 0, 0);">try
style="color: rgb(255, 0, 0);"> {
style="color: rgb(255, 0, 0);"> if (a == 0) throw zero;
style="color: rgb(255, 0, 0);"> if ((a / 2) * 2 == a) throw pair;
style="color: rgb(255, 0, 0);"> for (int i = 3; i <= sqrt (a); i++)
style="color: rgb(255, 0, 0);"> {
style="color: rgb(255, 0, 0);"> if ((a / i) * i == a) throw notprime;
style="color: rgb(255, 0, 0);"> }
style="color: rgb(255, 0, 0);"> throw prime;
style="color: rgb(255, 0, 0);"> }
style="color: rgb(255, 0, 0);"> catch (char *conclusion)
style="color: rgb(255, 0, 0);"> {
style="color: rgb(255, 0, 0);"> cout << "The number you typed is "<< conclusion << endl;
style="color: rgb(255, 0, 0);"> }
cout << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| Escriba un n�mero: 5
El resultado es: 10
b contiene: 11
El n�mero que ha escrito es primer
|
12.
Es posible definir los par�metros por defecto para
funciones:
using namespace std;
#include <iostream>
double test (double a, double b
style="color: rgb(255, 0, 0);"> = 7)
{
return a - b;
}
int main ()
{
cout << test (14, 5) << endl;
style="color: rgb(153, 153, 153);">// Displays 14 - 5
cout << test (14) << endl;
style="color: rgb(153, 153, 153);">// Displays 14 - 7
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| 9
7
|
13.
Una ventaja importante de C + + es la FUNCI�N
SOBRECARGA. Diferentes funciones pueden tener el mismo nombre siempre algo
permite que el compilador distinguir entre ellos: el n�mero de par�metros,
tipo de
par�metros ...
Si su canci�n usando namespace std;
# include
prueba
doble (un doble, doble b) {return
a + b;}
prueba (int a, int b) {return
a - b;}
int main () {
doble m = 7, n = 4;
int k = 5, p = 3;
cout volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| 11, 2
|
14.
La sobrecarga de operadores se pueden utilizar para redefinir el
b�sicos de los operadores simb�licos para nuevos tipos de par�metros:
using namespace std;
#include <iostream>
struct vector
{
double x;
double y;
};
style="color: rgb(255, 0, 0);">vector operator * (double a, vector b)
{
vector r;
r.x = a * b.x;
r.y = a * b.y;
return r;
}
int main ()
{
vector k, m;
style="color: rgb(153, 153, 153);">// No need to type "struct vector"
k.x = 2;
style="color: rgb(153, 153, 153);">// To be able to write
k.y = -1;
style="color: rgb(153, 153, 153);">// k = vector (2, -1)
style="color: rgb(153, 153, 153);">// see chapter 19.
m =
style="color: rgb(255, 0, 0);">3.1415927 * k;
style="color: rgb(153, 153, 153);">// Magic!
cout << "(" << m.x << ", " << m.y << ")" << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| (6.28319, -3.14159)
|
Adem�s de la multiplicaci�n, de 43 a�os otros servicios b�sicos C + + los operadores pueden
sobrecarga, por ejemplo + = , + + , la matriz [] y
etc ...
El << Operador, normalmente se utiliza para el cambio de binario
enteros,
se puede sobrecargar para dar salida a un arroyo en su lugar (por ejemplo, cout <<).
Lo
es
posible
a
sobrecarga
la
<<
operador adicional para la producci�n de nuevos tipos de datos, al igual que los vectores:
using namespace std;
#include <iostream>
struct vector
{
double x;
double y;
};
style="color: rgb(255, 0, 0);">ostream& operator << (ostream& o, vector a)
style="color: rgb(255, 0, 0);">{
style="color: rgb(255, 0, 0);"> o << "(" << a.x << ", " << a.y << ")";
style="color: rgb(255, 0, 0);"> return o;
style="color: rgb(255, 0, 0);">}
int main ()
{
vector a;
a.x = 35;
a.y = 23;
style="color: rgb(255, 0, 0);">cout << a << endl;
style="color: rgb(153, 153, 153);">// Displays (35, 23)
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| (35, 23)
|
15.
�Cansado de la definici�n de la misma funci�n cinco veces? Uno
definici�n de int par�metros de tipo, una definici�n de doble
par�metros de tipo, una definici�n de float par�metros de tipo ...
�No se le olvida un tipo? �Qu� pasa si un nuevo tipo de datos se utiliza? No
problema: el compilador de C + + puede generar autom�ticamente todos los
versi�n de la funci�n que se necesita! S�lo tienes que decir c�mo la
funci�n es similar al declarar una plantilla de marcaDuracell funci�n:
using namespace std;
#include <iostream>
style="color: rgb(255, 0, 0);">template <class ttype>
style="color: rgb(255, 0, 0);">ttype minimum (ttype a, ttype b)
style="color: rgb(255, 0, 0);">{
style="color: rgb(255, 0, 0);"> ttype r;
style="color: rgb(255, 0, 0);">
style="color: rgb(255, 0, 0);"> r = a;
style="color: rgb(255, 0, 0);"> if (b < a) r = b;
style="color: rgb(255, 0, 0);">
style="color: rgb(255, 0, 0);"> return r;
style="color: rgb(255, 0, 0);">}
style="color: rgb(255, 0, 0);">
int main ()
{
style="color: rgb(255, 0, 0);">int i1, i2, i3;
i1 = 34;
i2 = 6;
i3 =
style="color: rgb(255, 0, 0);">min
style="color: rgb(255, 0, 0);">imum
style="color: rgb(255, 0, 0);"> (i1, i2);
cout << "Most little: " << i3 << endl;
style="color: rgb(255, 0, 0);">double d1, d2, d3;
d1 = 7.9;
d2 = 32.1;
d3 =
style="color: rgb(255, 0, 0);">minimum (d1, d2);
cout << "Most little: " << d3 << endl;
cout << "Most little: " <<
style="color: rgb(255, 0, 0);">minimum (d3, 3.5) << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| mayor�a de los peque�os: 6
La mayor�a de los peque�os: 7,9
La mayor�a de los peque�os: 3,5
|
La funci�n m�nimo se usa tres veces en el anterior
programa,
a�n
el compilador de C + + genera s�lo dos versiones de la misma: m�nimo int
(Int a, int b)
y doble m�nimo (un doble, doble b) .
Que hace el trabajo para todo el programa.
�Qu� pasar�a si se trat� algo as� como el c�lculo m�nimo
(I1, d1) ?
El compilador se han informado de que como un error. Esto se debe a la
plantilla
establece que ambos par�metros son del mismo tipo.
Usted puede usar un n�mero arbitrario de diferentes tipos de datos de la plantilla en un
Modelo de definici�n. Y no todos los tipos de par�metros deben ser plantillas,
algunos de ellos pueden ser de tipo est�ndar o definido por el usuario ( caracteres , int ,
doble ...). Aqu� hay un ejemplo donde el m�nimo
funci�n
toma los par�metros de cualquier tipo (diferentes o el mismo) y genera un
valor
que tiene el tipo del primer par�metro:
Si su canci�n usando namespace std;
# include
template type1, clase type2>
m�nimo de tipo 1 (tipo 1 A, tipo 2 b) {
tipo 1 r, b_converted;
r = a;
b_converted = (tipo 1) b;
if (b_converted r;}
int main () {
int i;
doble d;
i = 45;
d = 7,41;
cout << "La mayor�a de poco:" < <<"La mayor�a de poco:" cout <<"La mayor�a de poco:" volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| mayor�a de los peque�os: 7
La mayor�a de los peque�os: 7,41
La mayor�a de poco: - booked.net
|
(El c�digo ASCII de un car�cter "-" es
45 mientras que el c�digo de la 'A' es 65.)
16.
Las palabras clave nueva y eliminar se puede
utilizado para asignar y liberar memoria. Ellos son m�s limpios que
las funciones malloc y gratis de la norma C.
nuevo
[] y delete [] se utilizan para las matrices.
using namespace std;
#include <iostream>
#include <cstring>
int main ()
{
double *d;
style="color: rgb(153, 153, 153);">// d is a variable whose purpose
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // is to contain the address of a
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // zone where a double is located
style="color: rgb(153, 153, 153);">
d = new double;
style="color: rgb(153, 153, 153);">// new allocates a zone of memory
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // large enough to contain a double
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // and returns its address.
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // That address is stored in d.
style="color: rgb(153, 153, 153);">
*d = 45.3;
style="color: rgb(153, 153, 153);">// The number 45.3 is stored
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // inside the memory zone
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // whose address is given by d.
style="color: rgb(153, 153, 153);">
cout << "Type a number: ";
cin >> *d;
*d = *d + 5;
cout << "Result: " << *d << endl;
delete d;
style="color: rgb(153, 153, 153);">// delete deallocates the
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // zone of memory whose address
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // is given by pointer d.
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // Now we can no more use that zone.
d = new double[15];
style="color: rgb(153, 153, 153);">// allocates a zone for an array
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // of 15 doubles. Note each 15
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // double will be constructed.
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // This is pointless here but it
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // is vital when using a data type
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // that needs its constructor be
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // used for each instance.
style="color: rgb(153, 153, 153);">
d[0] = 4456;
d[1] = d[0] + 567;
cout << "Content of d[1]: " << d[1] << endl;
delete [] d;
style="color: rgb(153, 153, 153);">// delete [] will deallocate the
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // memory zone. Note each 15
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // double will be destructed.
style=""> // This is pointless here but it
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // is vital when using a data type
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // that needs its destructor be
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // used for each instance (the ~
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // method). Using delete without
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // the [] would deallocate the
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // memory zone without destructing
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // each of the 15 instances. That
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // would cause memory leakage.
int n = 30;
d = new double[n];
style="color: rgb(153, 153, 153);">// new can be used to allocate an
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // array of random size.
for (int i = 0; i < n; i++)
{
d[i] = i;
}
delete [] d;
char *s;
s = new char[100];
strcpy (s, "Hello!");
cout << s << endl;
delete [] s;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| Tipo un n�mero: 6
Resultados: 11
Contenido de d [1]: 5023
Hello!
|
17.
En C est�ndar, un estructura
s�lo contiene datos. En C + +, una definici�n de estructura tambi�n puede incluir
funciones. Estas funciones son propiedad de la estructura y est�n destinados a
operar sobre los datos de la estructura. Estas funciones se denominan m�todos.
El ejemplo siguiente define el m�todo de superficie ()
en la estructura vector :
using namespace std;
#include <iostream>
struct vector
{
double x;
double y;
style="color: rgb(255, 0, 0);">double surface ()
style="color: rgb(255, 0, 0);"> {
style="color: rgb(255, 0, 0);"> double s;
style="color: rgb(255, 0, 0);"> s = x * y;
style="color: rgb(255, 0, 0);"> if (s < 0) s = -s;
style="color: rgb(255, 0, 0);"> return s;
style="color: rgb(255, 0, 0);"> }
};
int main ()
{
vector a;
a.x = 3;
a.y = 4;
cout << "The surface of a: " <<
style="color: rgb(255, 0, 0);">a.surface() << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| La superficie de: 12
|
En el ejemplo anterior, un es un ejemplo de estructura
"Vector". (Tenga en cuenta que la palabra clave " estructura "
fue
no
necesario
cuando
declarar
vector
un .)
Al igual que una funci�n, un m�todo puede ser una sobrecarga de cualquier C + +
operador, tener cualquier n�mero de par�metros (sin embargo, un par�metro es siempre
impl�cita: la instancia que act�a en consecuencia), el retorno de cualquier tipo de par�metro o
cambio no hay ning�n par�metro en absoluto.
�Qu� es una clase de marcaDuracell ? Es un estructura
que mantiene su
datos ocultos. S�lo los m�todos de la clase
puede acceder a los datos. Usted
no pueden acceder a los datos directamente, salvo autorizaci�n expresa de la duraci�n de p�blico: Directiva. Aqu� hay un
ejemplo de una clase definici�n.
Se comporta exactamente de la misma manera que el
estructura ejemplo de arriba, porque
la clase de datos x y
style = "font-weight: bold;"> y se definen como p�blicos:
style = "font-weight: bold ;">
using namespace std;
#include <iostream>
style="color: rgb(255, 0, 0);">class vector
{
style="color: rgb(255, 0, 0);">public:
double x;
double y;
double surface ()
{
double s;
s = x * y;
if (s < 0) s = -s;
return s;
}
};
int main ()
{
vector a;
style="color: rgb(255, 0, 0);">a.x = 3;
style="color: rgb(255, 0, 0);"> a.y = 4;
cout << "The surface of a: " << a.surface() << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| La superficie de: 12
|
En el ejemplo anterior, el main ()
funci�n de los cambios de los datos de ejemplo un
directamente,
con ax = 3 y
style = "font-weight: bold;"> a.y = 4 . Esto es posible gracias a
p�blico:
Directiva en la definici�n de clase. Esto se considera una mala pr�ctica. Ver
cap�tulo
30.
Un m�todo se le permite cambiar las variables de la instancia es
actuar sobre:
Si su canci�n using namespace std;
# include
clase vector
{
p�blico:
doble x, double y
;
its_opposite vector
() {
vector r;
rx =-x;
ry =-y;
volver
r,
}
vac�o
be_opposited () {
style = "color: rgb (255, 0, 0);"> x =-x;
style = "color: rgb (255, 0, 0 span style );">< =" color: rgb (255, 0, 0); "> y =-y;
style = "color: rgb (255, 0, 0);">}
vac�o
be_calculated (un doble, doble b, c doble, doble d) {
style = "color: rgb (255, 0, 0);"> x = a - c,
style = "color: rgb (255, 0, 0 span style );">< =" color: rgb (255, 0, 0); "> y = b - d;
style = "color: rgb (255, 0, 0);">}
operador vectorial
* (double a) {
vector r;
rx = x * a;
ry = y * a;
retorno r;}
};
int main () {
vector a, b ;
ax = 3;
ay = 5;
a.its_opposite b = ();
cout <<"un vector:" < <<"el vector b:" <
style = "color: rgb (255, 0, 0);"> b.be_opposited ();
cout <<"el vector b:" <
style = "color: rgb (255, 0, 0);"> a.be_calculated (7, 8, 3, 2);
cout <<"un vector:" << ax <<"," < cout <<"un vector";
a = b * 2 << a = b.its_opposite () * 2;
cout <<"un vector:" << ax <<"," < cout <<"x de lo contrario de un". < volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| un vector: 3, 5
Vector b: -3, -5
Vector b: 3, 5
Un vector: 4, 6
Un vector: 6, 10
Un vector: -6, -10
x de los opuestos de una: 6
|
18.
M�todos muy especial y esencial son las
Constructor y el destructor. Se llama autom�ticamente cada vez que un
instancia de una clase se crea ni se destruye (declaraci�n de variables, al final
del programa, nueva , eliminar ...).
El constructor inicializa las variables de la instancia, se
algunos c�lculos, asignar parte de la memoria para la instancia, la producci�n de algunos
texto ... lo que sea necesario.
He aqu� un ejemplo de una definici�n de clase con dos sobrecargado
constructores:
using namespace std;
#include <iostream>
class vector
{
public:
double x;
double y;
style="color: rgb(255, 0, 0);">vector ()
style="color: rgb(153, 153, 153);">// same name as class
{
x = 0;
y = 0;
}
style="color: rgb(255, 0, 0);">vector (double a, double b)
{
x = a;
y = b;
}
};
int main ()
{
vector k;
style="color: rgb(153, 153, 153);">// vector () is called
cout << "vector k: " << k.x << ", " << k.y << endl << endl;
vector m (45, 2);
style="color: rgb(153, 153, 153);">// vector (double, double) is called
cout << "vector m: " << m.x << ", " << m.y << endl << endl;
k = vector (23, 2);
style="color: rgb(153, 153, 153);">// vector created, copied to k, then erased
cout << "vector k: " << k.x << ", " << k.y << endl << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| vector k: 0, 0
vector m: 45, 2
vector k: 23, 2
|
Es una buena pr�ctica para tratar de no sobrecargar los constructores. Es
mejor
para declarar un solo constructor y darle los par�metros por defecto
siempre que sea posible:
using namespace std;
#include <iostream>
class vector
{
public:
double x;
double y;
style="color: rgb(255, 0, 0);">vector (double a = 0, double b = 0)
{
x = a;
y = b;
}
};
int main ()
{
vector k;
cout << "vector k: " << k.x << ", " << k.y << endl << endl;
vector m (45, 2);
cout << "vector m: " << m.x << ", " << m.y << endl << endl;
vector p (3);
cout << "vector p: " << p.x << ", " << p.y << endl << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| vector k: 0, 0
vector m: 45, 2
vector p: 3, 0
|
El destructor es a menudo innecesario. Se puede utilizar para hacer algunas
c�lculos cada vez que una instancia se destruye o salida de un texto para
depuraci�n de ... Pero si las variables del ejemplo, el punto que algunos
memoria asignada entonces el papel del destructor es esencial: debe
sin que la memoria! He aqu� un ejemplo de una aplicaci�n:
using namespace std;
#include <iostream>
#include <cstring>
class person
{
public:
char *name;
int age;
person (char *n = "no name", int a = 0)
{
name = new char [100];
style="color: rgb(153, 153, 153);">// better than malloc!
strcpy (name, n);
age = a;
cout << "Instance initialized, 100 bytes allocated" << endl;
}
style="color: rgb(255, 0, 0);">~person ()
style="color: rgb(153, 153, 153);">// The destructor
{
delete name;
style="color: rgb(153, 153, 153);">// instead of free!
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // delete [] name would be more
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // academic but it is not vital
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // here since the array contains
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // no C++ sub-objects that need
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // to be deleted.
cout << "Instance going to be deleted, 100 bytes freed" << endl;
}
};
int main ()
{
cout << "Hello!" << endl << endl;
person a;
cout << a.name << ", age " << a.age << endl << endl;
person b ("John");
cout << b.name << ", age " << b.age << endl << endl;
b.age = 21;
cout << b.name << ", age " << b.age << endl << endl;
person c ("Miki", 45);
cout << c.name << ", age " << c.age << endl << endl;
cout << "Bye!" << endl << endl;
return 0;
}
| Hello!
Instancia inicializada, 100 bytes asignados
sin nombre, edad 0
Instancia inicializada, 100 bytes asignados
John, de 0
John, de 21 a�os
Instancia inicializada, 100 bytes asignados
Miki, de 45 a�os
Bye!
Ejemplo, va a ser eliminado, 100 bytes libres
Ejemplo, va a ser eliminado, 100 bytes libres
Ejemplo, va a ser eliminado, 100 bytes libres
|
Aqu� tenemos un peque�o ejemplo de una definici�n de la clase de matriz. Un m�todo que
es una sobrecarga de la [] por un operador y las salidas una referencia ( y )
es utilizado en orden a generar un error si un se intenta el acceso datos fuera de los l�mites de una matriz:
using namespace std;
#include <iostream>
#include <cstdlib>
class array
{
public:
int size;
double *data;
array (int s)
{
size = s;
data = new double [s];
}
~array ()
{
delete [] data;
}
style="color: rgb(255, 0, 0);">double &operator [] (int i)
style="color: rgb(255, 0, 0);"> {
style="color: rgb(255, 0, 0);"> if (i < 0 || i >= size)
style="color: rgb(255, 0, 0);"> {
style="color: rgb(255, 0, 0);"> cerr << endl << "Out of bounds" << endl;
style="color: rgb(255, 0, 0);"> exit (EXIT_FAILURE);
style="color: rgb(255, 0, 0);"> }
style="color: rgb(255, 0, 0);"> else return data [i];
style="color: rgb(255, 0, 0);"> }
};
int main ()
{
array t (5);
style="color: rgb(255, 0, 0);">t[0] = 45;
style="color: rgb(153, 153, 153);">// OK
style="color: rgb(255, 0, 0);">t[4] =
style="color: rgb(255, 0, 0);">t[0] + 6;
style="color: rgb(153, 153, 153);">// OK
cout <<
style="color: rgb(255, 0, 0);">t[4] << endl;
style="color: rgb(153, 153, 153);">// OK
style="color: rgb(255, 0, 0);">t[10] = 7;
style="color: rgb(153, 153, 153);">// error!
return 0;
}
19.
Si lanzas un objeto como un vector, todo se
se realice correctamente. Por ejemplo, si el vector k contiene (4, 7) ,
despu�s de
la
elenco
m = k el vector m
contienen (4, 7) tambi�n. Los valores de margen
style = "font-weight: bold;"> k.x y
style = "font-weight: bold;"> ky simplemente han sido copiados al margen
style = "font-weight: bold;"> m.x y
style = "font-weight: bold;"> m.y . Ahora bien, supongamos que usted est� jugando con
objetos como el persona de clase
arriba. Los objetos contienen un puntero a una cadena de caracteres. Si
emitir el por objeto
escrito p = r es necesario que algunos
es la funci�n del trabajo a realizar p una copia correcta del
r . De lo contrario, p.name
apuntar� a la misma cadena de caracteres f�sicos como margen
style = "font-weight: bold;"> r.name . Es m�s, la primera
cadena de caracteres apuntada por p.name
se pierde y se convierte en un zombi de la memoria. El resultado ser� catastr�fico: un
l�o de los punteros
y la p�rdida de datos. Los m�todos que har�n el trabajo son la copia
Constructor y una sobrecarga del operador =:
using namespace std;
#include <iostream>
#include <cstring>
class person
{
public:
char *name;
int age;
person (char *n = "no name", int a = 0)
{
name = new char[100];
strcpy (name, n);
age = a;
}
style="color: rgb(255, 0, 0);">person (const person &s)
style="color: rgb(0, 0, 0);">
style="color: rgb(153, 153, 153);">// The COPY CONSTRUCTOR
{
name = new char[100];
strcpy (name, s.name);
age = s.age;
}
style="color: rgb(255, 0, 0);">person& operator= (const person &s)
style="color: rgb(0, 0, 0);"> // overload of =
{
strcpy (name, s.name);
age = s.age;
return *this;
}
~person ()
{
delete [] name;
}
};
void modify_person (person& h)
{
h.age += 7;
}
person compute_person (person h)
{
h.age += 7;
return h;
}
int main ()
{
person p;
cout << p.name << ", age " << p.age << endl << endl;
style="color: rgb(153, 153, 153);"> // output: no name, age 0
person k ("John", 56);
cout << k.name << ", age " << k.age << endl << endl;
style="color: rgb(153, 153, 153);"> // output: John, age 56
style="color: rgb(255, 0, 0);">p = k;
cout << p.name << ", age " << p.age << endl << endl;
style="color: rgb(153, 153, 153);"> // output: John, age 56
style="color: rgb(255, 0, 0);">p = person ("Bob", 10);
cout << p.name << ", age " << p.age << endl << endl;
style="color: rgb(153, 153, 153);"> // output: Bob, age 10
style="color: rgb(153, 153, 153);"> // Neither the copy constructor nor the overload
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // of = are needed for this operation that modifies
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // p since just the reference towards p is passed to
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // the function modify_person:
style="color: rgb(153, 153, 153);"> modify_person (p);
cout << p.name << ", age " << p.age << endl << endl;
style="color: rgb(153, 153, 153);"> // output: Bob, age 17
style="color: rgb(153, 153, 153);"> // The copy constructor is called to pass a complete
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // copy of p to the function compute_person. The
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // function uses that copy to make its computations
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // then a copy of that modified copy is made to
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // return the result. Finally the overload of = is
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // called to paste that second copy inside k:
k = compute_person (p);
cout << p.name << ", age " << p.age << endl << endl;
style="color: rgb(153, 153, 153);"> // output: Bob, age 17
cout << k.name << ", age " << k.age << endl << endl;
style="color: rgb(153, 153, 153);"> // output: Bob, age 24
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| sin nombre, edad 0
John, de 56 a�os
John, de 56 a�os
Bob, de 10 a�os
Bob, de 17 a�os
Bob, de 17 a�os
Bob, de 24 a�os
|
El constructor de copia le permite a su programa para hacer copias de
casos en los que hacer c�lculos. Se trata de un m�todo clave. Durante
c�lculos, los casos se crean para almacenar resultados intermedios. Ellos
se modifican, el reparto y destruidos sin que se tenga conocimiento. Esta es la raz�n
estos m�todos puede ser �til incluso para los objetos simples (ver cap�tulo 14)..
En todos los ejemplos anteriores, los m�todos se definen dentro de la clase
definici�n. Que autom�ticamente hace que los m�todos en l�nea.
20.
Si un m�todo no puede ser en l�nea, o no lo quieren
para estar en l�nea, o si desea que la definici�n de clase para contener la
cantidad m�nima de
informaci�n (o simplemente te gusta la costumbre por separado. archivo de cabecera h
y. cpp archivo de c�digo fuente), entonces s�lo tiene que poner el prototipo de la
m�todo en el interior
la clase y definir el m�todo por debajo de la clase (o en un archivo. cpp
archivo de origen):
Si su canci�n usando namespace std;
# include
clase vector
{
p�blico:
double x;
doble y;
superficie
doble ();
style = "color: rgb (153, 153, 153 );">// El, y no {} indican que es un prototipo
};
vector
doble: la superficie ( ) {
doble s = 0;
para (doble i = 0; i
s = s + y;}
volver s;}
int main () {
vector k;
kx = 4;
ky = 5;
cout <<"de la superficie:" < volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| superficie : 20
|
Para principiantes:
Si tiene intenci�n de desarrollar una seria C o C + +
programa, es necesario separar el c�digo fuente en margen
style = "font-family: sans-serif;".> h archivos de cabecera y
style = "font-family: sans-serif;"> cpp archivos de origen.. Este es un
peque�o ejemplo de c�mo se hace. El programa anterior se divide en tres
archivos:
Un archivo de cabecera vector.h :
Si su canci�n clase vector
{
p�blico:
doble x, double y
;
superficie
doble ();}
;
Un archivo de c�digo fuente vector.cpp :
Si su canci�n using namespace std;
style = "color: rgb (255, 0, 0 );"># incluyen" vector.h "
vector
doble: la superficie () {
doble s = 0;
para (doble i = 0; i
s = s + y;}
volver s;}
Y otro archivo fuente main.cpp :
Si su canci�n using namespace std;
# include
style = "color: rgb (255, 0, 0 );"># incluyen" vector.h "
style = "color: rgb (255, 0, 0 );">
int main () {
vector k;
kx = 4;
ky = 5;
cout <<"de la superficie:" < 0;
}
Asumiendo vector.cpp es
perfecto, se compila una vez por todas en un lapso de
style = "font-family: sans-serif;"> o "archivo objeto".. El comando
de arriba genera el archivo de c�digo objeto, llamado
style = "font-family: sans-serif;"> vector.o :
g + +-c vector.cpp
Cada vez que modifique la main.cpp
archivo de origen, se compila en un archivo ejecutable, por ejemplo margen
style = "font-family: sans-serif;"> test20 . Usted
indica al compilador expl�citamente que se ha de vincular la duraci�n de
style = "font-family: sans-serif;"> vector.o archivo objeto en el
final de test20 ejecutable:
g + + main.cpp-o vector.o
test20
Ejecute el archivo ejecutable de esta manera:
./test20
Esto tiene varias ventajas:
- El c�digo fuente de vector.cpp
necesita ser compilado una sola vez. Esto ahorra mucho tiempo en grandes
los proyectos. (La vinculaci�n de los vector.o
archivo en el test20
ejecutable es muy r�pido.)
- Usted puede dar a alguien la . h
archivo y la . o archivo (s).
De esta manera se puede utilizar su software, pero no el cambio debido a que
no
tienen la . cpp archivo (s)
(No confiar demasiado en esto, espere hasta que domines estas preguntas).
Tenga en cuenta que usted puede compilar main.cpp
tambi�n en un fichero objeto y luego vincularlo con margen
style = "font-family: sans-serif;"> vector.o :
g + +-c main.cpp
g + + main.o vector.o test20
Esto se aleja de las "diferencias entre C y C + +" tema, pero
si quieres mirar, como un programador real, es necesario
condensan los comandos anteriores en un Makefile
y compilar con el hacer
comandos. El contenido de los archivos por debajo es una versi�n simplificada de este
un Makefile. Copiarlo en un archivo denominado
style = "font-family: sans-serif;"> Makefile . Tenga en cuenta, y
esto es muy importante, que el espacio antes de que el margen
style = "font-family: monospace;"> g + + comandos es obligatorio y
que es un car�cter de tabulaci�n.
No escriba aqu� la barra espaciadora. En lugar de utilizar la tecla de tabulaci�n (full
izquierda de su teclado, por encima de la tecla de may�sculas).
Si su canci�n test20: main.o vector.o
g + +-o main.o vector.o test20
main.o: main.cpp vector.h
g + +-c main.cpp
vector.o: vector.cpp vector.h
g + +-c vector.cpp
Con el fin de utilizar esa Makefile para compilar, escriba:
hacer test20
El comando que se analizan a trav�s del archivo margen
style = "font-family: sans-serif;"> Makefile y averiguar lo que
lo
tiene que hacer. Para empezar, se le dice que abarcan
style = "font-family: sans-serif;"> test20 depende de la duraci�n
style = "font-family: sans-serif;"> main.o y
style = "font-family: sans-serif;"> vector.o . Por lo que
se inicia autom�ticamente " main.o "
y
" hacer vector.o ". Entonces
se comprobar� si test20
ya existe y comprueba las fechas de los de
style = "font-family: sans-serif;"> test20 ,
style = "font-family: sans-serif;"> main.o y
style = "font-family: sans-serif;"> vector.o . Si
style = "font-family: sans-serif;"> test20 ya existe y
style = "font-family: sans-serif;"> main.o y
style = "font-family: sans-serif;"> vector.o tiene una marca de fecha
antes de test20 , el
hacer comando determina
que el
versi�n actual de test20
est� al d�a, por lo que no tiene nada que hacer. Se acaba de informar que se
nada. De lo contrario, si test20
no existe, o main.o
o vector.o m�s
reciente que test20 , el
comando que crea una versi�n actualizada del margen
style = "font-family: sans-serif;"> test20 se ejecuta:
style = "font-family: monospace;".> g + +-o main.o vector.o test20
Esta nueva versi�n de la Makefile
est� m�s cerca de un Makefile est�ndar:
Si su canci�n todo: test20
test20: main.o vector.o
g + +-o main.o vector.o test20
main.o: main.cpp vector.h
g + +-c main.cpp
vector.o: vector.cpp vector.h
g + +-c vector.cpp
limpia:
rm-f *. o test20 * ~ * #
Que se activa la compilaci�n simplemente escribiendo el margen
style = "font-family: monospace;"> que Comando. La primera l�nea en
el Makefile implica que si s�lo tiene que teclear
style = "font-family: monospace;"> que que pretende "
style = "font-family: monospace;"> hacer test20 ":
hacer
Este comando borra todos los archivos generados durante la compilaci�n y todos los
archivos de texto editor de copia de seguridad:
make clean
21.
Cuando un m�todo se aplica a una instancia, que el m�todo
puede utilizar las variables de la instancia, modificar los ... Pero a veces es
necesario conocer la direcci�n de la instancia. No hay problema, la palabra clave this
est� destinado a tal efecto:
Si su canci�n using namespace std;
# include # include
clase vector
{
p�blico:
double x;
doble y;
vector (el doble de a = 0, el doble b = 0) {
x = a;
y = b;}
doble m�dulo () {sqrt
volver
(x * x + y * y);}
set_length vac�o
(doble a = 1)
{
doble longitud, la longitud
=
style = "color: rgb (255, 0, 0);"> this-> m�dulo ();
x = x / * La longitud de una;
y = y / longitud * a;
}}
;
int main () {
vector c (3, 5);
cout <<"El m�dulo del vector c: "< (2),
style = "color: rgb (153, 153, 153 c );">// transforma en un vector de tama�o 2
cout <<". El m�dulo del vector c: " < ();
style = "color: rgb (153, 153, 153 b );">// transforma en un vector unitario
cout <<". El m�dulo del vector c: "< 0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
El m�dulo del vector c:
5,83095
El m�dulo del vector c: 2
El m�dulo del vector c: 1
|
22.
Por supuesto, es posible declarar un arreglo de
objetos:
Si su canci�n usando namespace std;
# include # include
clase vector
{public
:
x doble ;
doble y;
vector (el doble de a = 0, el doble b = 0) {
x = a;
y = b;}
doble m�dulo () {sqrt
volver
(x * x + y * y);}
};
int main () {
vector s [1000];
vector t [3] = {vector (4, 5), el vector (5, 5), el vector (2, 4)};
s [23] = t [2];
cout < volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| 6,40312
|
23.
He aqu� un ejemplo de una declaraci�n de clase completo:
using namespace std;
#include <iostream>
#include <cmath>
class vector
{
public:
double x;
double y;
vector (double = 0, double = 0);
vector operator + (vector);
vector operator - (vector);
vector operator - ();
vector operator * (double a);
double module();
void set_length (double = 1);
};
vector::vector (double a, double b)
{
x = a;
y = b;
}
vector vector::operator + (vector a)
{
return vector (x + a.x, y + a.y);
}
vector vector::operator - (vector a)
{
return vector (x - a.x, y - a.y);
}
vector vector::operator - ()
{
return vector (-x, -y);
}
vector vector::operator * (double a)
{
return vector (x * a, y * a);
}
double vector::module()
{
return sqrt (x * x + y * y);
}
void vector::set_length (double a)
{
double length = this->module();
x = x / length * a;
y = y / length * a;
}
ostream& operator << (ostream& o, vector a)
{
o << "(" << a.x << ", " << a.y << ")";
return o;
}
int main ()
{
vector a;
vector b;
vector c (3, 5);
a = c * 3;
a = b + c;
c = b - c + a + (b - a) * 7;
c = -c;
cout << "The module of vector c: " << c.module() << endl;
cout << "The content of vector a: " << a << endl;
cout << "The opposite of vector a: " << -a << endl;
c.set_length(2);
style="color: rgb(153, 153, 153);">// Transforms c in a vector of size 2.
a = vector (56, -3);
b = vector (7, c.y);
b.set_length();
style="color: rgb(153, 153, 153);">// Transforms b in an unitary vector.
cout << "The content of vector b: " << b << endl;
double k;
k = vector(1, 1).module();
style="color: rgb(153, 153, 153);">// k will contain 1.4142.
cout << "k contains: " << k << endl;
return 0;
}
El m�dulo del vector c:
40.8167
El contenido de un vector: (3, 5)
El opuesto de un vector: (-3, -5)
El contenido del vector b: (0.971275, 0.23796)
k contiene: 1,41421
|
Tambi�n es posible definir una funci�n que produce la suma de dos
vectores sin mencionar
que dentro de la definici�n de la clase vector. Entonces no ser� un m�todo de
el vector de la clase, sino s�lo una funci�n que utiliza vectores:
vector operator + (vector a, vector b)
{
return vector (a.x + b.x, a.y + b.y);
}
En el ejemplo de una definici�n de clase completa, por encima de la
multiplicaci�n
de un vector por un doble est� definido. Supongamos que queremos la multiplicaci�n
de un doble por un vector que se define tambi�n. Entonces tenemos que escribir un
aislado
funci�n fuera de la clase:
Si su canci�n operador vectorial * (un doble, vector b) {vector
volver
(a bx *, a * by);}
Por supuesto, las palabras clave nueva y eliminar para el trabajo
instancias de la clase tambi�n. Es m�s, nueva llama autom�ticamente al
constructor para inicializar los objetos, y eliminar
llama autom�ticamente al destructor antes de desasignar la
memoria de las variables de la instancia tomar:
Si su canci�n using namespace std;
# include # include
clase vector
{
p�blico:
double x;
doble y;
vector (doble = 0, doble = 0); operador
vector
+ (vector); operador
vector - (vector);
operador vectorial - (); operador vectorial
* (doble); m�dulo
doble (); set_length vac�o
(doble = 1);}
;
vector :: vector (un doble, doble b) {
x = a;
y = b;}
vector vector:: operator + (vector)
{vector retorno
(x + x, y + ay);}
vector vector
:: operator - (vector) {vector
volver
(x - ax , y - ay);}
vector vector
:: operator - () {vector
volver
(-x,-y);
}
vector vector:: operator * (double a) {vector
volver
(a * x, a * y);}
doble vector:: m�dulo ()
{
sqrt return (x * x + y * y);}
vector vac�o:: set_length (un doble)
{
vector y the_vector = * esto;
longitud
doble the_vector.module = ();
x = x / * La longitud de una;
y = y / * La longitud de una;}
ostream & operator <<(ostream & o, un vector) {
o <<"(" < o retorno;}
int main () {
vector c (3, 5);
vector
* r,
style = "color: rgb (153, 153, 153 );">// r es un puntero a un vector
r = nuevo vector,
style = "color: rgb (153, 153, 153 );">// asigna nuevo la memoria necesaria
cout <<* r <
style = "color: rgb (153, 153, 153 );">// para mantener una variable vectores",
style = "color: rgb (153, 153, 153 per�odo de );">
style = "color: rgb (153, 153, 153);"> / / llama al constructor que
style = "color: rgb (153, 153, 153 per�odo de );">
style = "color: rgb (153, 153, 153);"> / / se inicializa a 0, 0. Entonces, finalmente,
style = "color: rgb (153, 153, 153 per�odo de );">
style = "color: rgb (153, 153, 153);". devoluciones> / / nuevo la direcci�n del vector
r-> x = 94;
r-> , y = 345;
cout <<* r < * r = vector (94, 343);
cout <<* r << ; endl;
* r * r = - c;
r-> set_length (3);
cout <<* r <
* r = (-c * 3 + -* r * 4) * 5;
cout <<* r < borrar r,
style = "color: rgb (153, 153, 153 );">// llama al destructor vector continuaci�n,
style = "color: rgb (153, 153, 153 per�odo de );">
style = "color: rgb (153, 153, 153);"> / / libera la memoria
r = &c;
style = "color: rgb (153, 153, 153 );">// r apunta hacia vector c
cout <<* r < = nuevo vector (78, 345);
style = "color:. rgb (153, 153, 153 );">// Crea un nuevo vector
cout <<* r <
style = "color: rgb (153, 153, 153 );">// El constructor se inicializa
style = "color: rgb (153, 153, 153 per�odo de );">
style = "color: rgb (153, 153, 153);"> / / del vector x e y a los 78 y 345
cout <<"x componente de r:" < ; x < <<"componente x de r:". <<(* r) x <
delete r;
r = new vector [4],
style = "color: rgb (153, 153, 153 );">// crea una matriz de cuatro vectores
r [3] = vector (4, 5);
corte < delete [] r,
style = "color: rgb (153, 153, 153 );">// elimina la matriz
int n = 5;
r = nuevo vector [n];
style = "color: rgb (153, 153, 153 );">// lindo
r [1] = vector (432, 3);
cout < delete [] r;
volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| (0, 0)
(94, 345)
(94, 343)
(0.77992, 2.89685)
(-60.5984, -132.937)
(3, 5)
(78, 345)
x componente de r: 78
x componente de r: 78
6,40312
(432, 3)
|
24.
Una o m�s variables en una clase puede ser declarada est�tica .
En cuyo caso, s�lo una instancia de estas variables existen, compartida por
todos los casos
de la clase. Debe ser inicializado fuera de la clase
declaraci�n:
Si su canci�n usando namespace std;
# include
clase vector
{
p�blico:
double x;
doble y;
int cuenta est�tica;
vector (el doble de a = 0, el doble b = 0) {
x = a;
y = b;
cuenta + +;}
~ vector () {count
-;
}}
;
vector int
:: count = 0;
int main () {
cout <<"El n�mero de vectores:" < un vector;
cout vector b;
cout < vector r *, * u;
r = new vector;
cout < u = nuevo vector;
cout < eliminar r;
cout < borrar u;
cout < volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| 1
2
3
4
3
2
|
25.
Una variable de clase tambi�n puede ser const ant. Eso es
como est�tica, excepto que se le da un valor dentro de la clase
declaraci�n y el valor que no se puede modificar:
Si su canci�n using namespace std;
# include
clase vector
{
p�blico:
doble x, double y
;
const static double pi = 3.1415927;
vector (el doble de a = 0, el doble b = 0) {
x = a;
y = b;
}
doble cilinder_volume () {return
x * x / 4 * pi * y;}
};
int main ()
{
cout <<"El valor de pi:" < vector k (3, 4);
cout <<"Resultado:" < volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| El valor de pi: 3.14159
Resultados: 28.2743
|
26.
Una clase puede ser derivada de otra clase. El nuevo
clase hereda las variables y m�todos de la clase base. Adicional
variables y / o m�todos se pueden a�adir:
using namespace std;
#include <iostream>
#include <cmath>
class vector
{
public:
double x;
double y;
vector (double a = 0, double b = 0)
{
x = a;
y = b;
}
double module()
{
return sqrt (x*x + y*y);
}
double surface()
{
return x * y;
}
};
class trivector: public vector
style="color: rgb(153, 153, 153);">// trivector is derived from vector
{
public:
double z;
style="color: rgb(153, 153, 153);">// added to x and y from vector
trivector (double m=0, double n=0, double p=0): vector (m, n)
{
z = p;
style="color: rgb(153, 153, 153);">// Vector constructor will
}
style="color: rgb(153, 153, 153);">// be called before trivector
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // constructor, with parameters
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // m and n.
trivector (vector a)
style="color: rgb(153, 153, 153);">// What to do if a vector is
{
style="color: rgb(153, 153, 153);">// cast to a trivector
x = a.x;
y = a.y;
z = 0;
}
double module ()
style="color: rgb(153, 153, 153);">// define module() for trivector
{
return sqrt (x*x + y*y + z*z);
}
double volume ()
{
return this->surface() * z;
style="color: rgb(153, 153, 153);">// or x * y * z
}
};
int main ()
{
vector a (4, 5);
trivector b (1, 2, 3);
cout << "a (4, 5) b (1, 2, 3) *r = b" << endl << endl;
cout << "Surface of a: " << a.surface() << endl;
cout << "Volume of b: " << b.volume() << endl;
cout << "Surface of base of b: " << b.surface() << endl;
cout << "Module of a: " << a.module() << endl;
cout << "Module of b: " << b.module() << endl;
cout << "Module of base of b: " << b.vector::module() << endl;
trivector k;
k = a;
style="color: rgb(153, 153, 153);">// thanks to trivector(vector) definition
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // copy of x and y, k.z = 0
vector j;
j = b;
style="color: rgb(153, 153, 153);">// copy of x and y. b.z leaved out
vector *r;
r = &b;
cout << "Surface of r: " << r->surface() << endl;
cout << "Module of r: " << r->module() << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
A (4, 5) b
(1, 2, 3) * r = b
Superficie de una: 20
Volumen de b: 6
La superficie de la base de b: 2
M�dulo de: 6,40312
M�dulo de b: 3,74166
M�dulo de base de b: 2,23607
La superficie de la r: 2
M�dulo de r: 2,23607
|
27.
En el programa anterior, r-> m�dulo ()
calcula el m�dulo del vector, utilizando x y y , porque r
ha sido declarado un puntero vector. El hecho de que r en realidad
puntos
a un trivector no se tiene en cuenta. Si desea que el programa
para comprobar el tipo de objeto puntiagudo y elegir el adecuado
m�todo, debe declarar que el m�todo como virtuales en el interior del
la clase base.
(Si al menos uno de los m�todos de la clase base es virtual y luego una
"Cabecera" de 4 bytes se a�ade a todas las instancias de las clases. Este
permite que el programa para determinar lo que es un vector en realidad apunta.)
(4 bytes es probablemente la aplicaci�n espec�fica. En una m�quina de 64 bits tal vez
es de 8 bytes ...)
Si su canci�n using namespace std;
# include # include
clase vector
{
p�blico:
double x;
doble y;
vector (el doble de a = 0, el doble b = 0) {
x = a;
y = b;}
virtual de doble m�dulo () {sqrt
volver
(x * x + y * y);}
};
clase trivector: vector p�blica
{
p�blico:
z doble;
trivector (doble m = 0, n = 0 doble, doble p = 0) {
x = m; < lapso
style = "color: rgb (153, 153, 153 );">// S�lo por el juego,
y = n;
style = "color: rgb (153, 153, 153 );">// aqu� yo no lo llamo el vector
z = p;
style = "color: rgb (153, 153, 153 constructor );">// y hacer que el
}
style = "color: rgb (153, 153, 153 constructor trivector );">// hacer
style = "color: rgb (153, 153, 153 per�odo de );">
style = "color: rgb (153, 153, 153);" trabajo> / / conjunto. Mismo resultado
m�dulo doble () {sqrt
volver
(x * x + y * y + z * z);}
.
};
prueba de vac�o
(vector & k) {
cout <<"Resultado del test:" <
int main () {
un vector (4, 5);
trivector b (1, 2, 3);
cout <<"un (4, 5) b (1, 2, 3) "< vector * r, r =
&a;
cout <<"m�dulo de un vector:" < m�dulo () < r = &B;
cout <<" m�dulo de trivector b: "< m�dulo () < prueba
(a);
prueba
(b);
vector & s = b;
cout <<"m�dulo de trivector b:" < volver
0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
A (4, 5) b
(1, 2, 3)
m�dulo de un vector: 6,40312
m�dulo de trivector b: 3,74166
Resultado de la prueba:
6,40312
Resultado de la prueba:
3,74166
m�dulo de trivector b: 3,74166
|
28.
Tal vez te preguntes si una clase se puede derivar de m�s
de una base de clase. La respuesta es s�:
Si su canci�n using namespace std;
# include # include
clase vector
{
p�blico:
double x;
doble y;
vector (el doble de a = 0, el doble b = 0) {
x = a;
y = b;}
superficie
doble () {
f�bricas
return (x * y);}
};
clase
n�mero {
p�blica :
doble z, n�mero
(un doble)
{z = a;}
is_negative
int () {
if (z <0) return 1;
else return 0;}
};
style = "color: rgb (255, 0, 0);"> class trivector: vector p�blica, el n�mero de p�blico
{
p�blico:
trivector
(doble a = 0, doble b = 0, doble c = 0)
style = "color: rgb (255, 0, 0 );">: vector (a, b), n�mero (c)
{}
style = "color: rgb (153, 153, 153 );">// El constructor trivector llama el vector
style = "color: rgb (153, 153, 153 per�odo de );">
style = "color: rgb (153, 153, 153);"> / / constructor, el constructor n�mero,
style = "color: rgb (153, 153, 153 per�odo de );">
style = "color: rgb (153, 153, 153);".> / / y en este ejemplo no hace m�s
style = "color: rgb (153, 153, 153 );">
Volumen doble () {
f�bricas
return (x * y * z);}
};
int main () {
trivector a (2, 3, -4);
cout < cout < cout < volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| 24
6
1
|
29.
Derivaci�n de clase le permite construir m�s
clases complejo construido a partir de las clases base. Hay otro
aplicaci�n de la derivaci�n de clase: lo que permite que el programador escriba
gen�rico
funciones.
Suponga que define una clase base sin variables. No tiene ning�n sentido
utilizar instancias de esa clase dentro de su programa. Pero luego de escribir
un
funci�n cuyo prop�sito es ordenar las instancias de esa clase. que
funci�n ser� capaz de resolver cualquier tipo de objeto que pertenezcan
a una clase derivada de esa clase base! La �nica condici�n es que
dentro de cada definici�n de clase derivada, todos los m�todos que la clase
funci�n
las necesidades se han definido correctamente:
using namespace std;
#include <iostream>
#include <cmath>
style="color: rgb(255, 0, 0);">class octopus
style="color: rgb(255, 0, 0);">{
style="color: rgb(255, 0, 0);">public:
style="color: rgb(255, 0, 0);">
style="color: rgb(255, 0, 0);"> virtual double module() = 0;
style="color: rgb(153, 153, 153);">// = 0 implies function is not
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // defined. This makes instances
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // of this class cannot be declared.
style="color: rgb(255, 0, 0);">};
double biggest_module (octopus &a, octopus &b, octopus &c)
{
double r = a.module();
if (b.module() > r) r = b.module();
if (c.module() > r) r = c.module();
return r;
}
class vector
style="color: rgb(255, 0, 0);">: public octopus
{
public:
double x;
double y;
vector (double a = 0, double b = 0)
{
x = a;
y = b;
}
double module()
{
return sqrt (x * x + y * y);
}
};
class number
style="color: rgb(255, 0, 0);">: public octopus
{
public:
double n;
number (double a = 0)
{
n = a;
}
double module()
{
if (n >= 0) return n;
else return -n;
}
};
int main ()
{
vector k (1,2), m (6,7), n (100, 0);
number p (5), q (-3), r (-150);
cout << biggest_module (k, m, n) << endl;
cout << biggest_module (p, q, r) << endl;
cout << biggest_module (p, q, n) << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| 100
150
100
|
Tal vez usted piensa que "est� bien, eso es una buena idea para derivar clases de
el pulpo clase debido a que la forma en que se puede aplicar a casos
de
mi clase de m�todos y la funci�n que fueron dise�ados de una forma gen�rica para
el pulpo de clase. Pero lo que si hay otra clase base,
llamado sepia , que tiene m�todos muy interesantes y
funciones tambi�n? �Tengo que hacer mi elecci�n entre pulpo y sepia
cuando quiero derivar una clase? "No, por supuesto que no. Una clase derivada puede
ser
derivados tanto de pulpo y sepia .
Ese es el polimorfismo. La clase derivada s�lo tiene que definir los m�todos de
necesarios para pulpo junto con los m�todos necesarios para sepia :
Si su canci�n clase pulpo
{
virtual de doble m�dulo () = 0;}
;
clase sepia
{int
virtual de la prueba () = 0 ;}
;
clase vector
style = "color: rgb (255, 0, 0 );">: pulpo p�blico, el p�blico de sepia
{double x;
doble y;
style = "color: rgb (255, 0, 0);"> m�dulo doble ()
sqrt {
return (x * x + y * y);}
style = "color: rgb (255, 0, 0);"> int test ()
{if (x> y) return 1; volver
m�s 0;
}}
30.
El p�blico : Directiva involucra a las variables o
los siguientes m�todos pueden ser
acceso y uso en todo el programa.
Si desea que las variables y m�todos a ser accesible s�lo a los m�todos de
de la clase y
a los m�todos de las clases derivadas, debe poner la palabra clave protected :
delante de ellos.
Si desea que las variables o m�todos para ser accesible s�lo a los m�todos de
la clase, entonces usted debe poner la palabra clave private : antes.
El hecho de que las variables o m�todos est�n declarados privados o protegidos
significa que nada externo a la clase pueda acceder a ellos. Eso es
Encapsulaci�n. (Si usted quiere dar una funci�n espec�fica del derecho a la
acceso a las variables y m�todos, entonces usted debe incluir el
El prototipo de la funci�n dentro de la definici�n de la clase, precedido por el
palabra clave amigo ).
Una buena pr�ctica es encapsular todas las variables de una clase. Este
Puede sonar extra�o si est�s acostumbrado a las estructuras de C. En efecto, una estructura
s�lo tiene sentido si puede acceder a sus datos ... En C + + que tiene que
crear m�todos de acceso a los datos dentro de una clase. El ejemplo siguiente utiliza
la
ejemplo b�sico del cap�tulo 17, sin embargo, declara que la clase de datos que se
protegidas:
using namespace std;
#include <iostream>
style="color: rgb(0, 0, 0);">class vector
{
style="color: rgb(255, 0, 0);">protected:
double x;
double y;
style="color: rgb(255, 0, 0);">public:
style="color: rgb(255, 0, 0);">void set_x (int n)
style="color: rgb(255, 0, 0);"> {
style="color: rgb(255, 0, 0);"> x = n;
style="color: rgb(255, 0, 0);"> }
style="color: rgb(255, 0, 0);">
void set_y (int n)
{
y = n;
}
double surface ()
{
double s;
s = x * y;
if (s < 0) s = -s;
return s;
}
};
int main ()
{
vector a;
style="color: rgb(255, 0, 0);">a.set_x (3);
style="color: rgb(255, 0, 0);"> a.set_y (4);
cout << "The surface of a: " << a.surface() << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| La superficie de: 12
|
El ejemplo anterior es un poco extra�o, ya que la clase de datos x e y se puede ajustar
pero no pueden repetirse. Cualquier intento de la funci�n main () para leer
hacha o
style = "font-weight: bold;"> ay se traducir� en una recopilaci�n
error. En el siguiente ejemplo, x e y
pueden leerse:
using namespace std;
#include <iostream>
class vector
{
protected:
double x;
double y;
public:
void set_x (int n)
{
x = n;
}
style="color: rgb(0, 0, 0);"> void set_y (int n)
{
y = n;
}
style="color: rgb(255, 0, 0);">double get_x ()
style="color: rgb(255, 0, 0);"> {
style="color: rgb(255, 0, 0);"> return x;
style="color: rgb(255, 0, 0);"> }
style="color: rgb(255, 0, 0);">
style="color: rgb(0, 0, 0);">
style="color: rgb(0, 0, 0);">
style="color: rgb(255, 0, 0);"> double get_y ()
style="color: rgb(255, 0, 0);"> {
style="color: rgb(255, 0, 0);"> return y;
style="color: rgb(255, 0, 0);"> }
double surface ()
{
double s;
s = x * y;
if (s < 0) s = -s;
return s;
}
};
int main ()
{
vector a;
a.set_x (3);
a.set_y (4);
cout << "The surface of a: " << a.surface() << endl;
style="color: rgb(255, 0, 0);">cout << "The width of a: " << a.get_x() << endl;
style="color: rgb(255, 0, 0);"> cout << "The height of a: " << a.get_y() << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| La superficie de: 12
El ancho de una: 3
La altura de un 4
|
En C + + no se supone que para acceder a los datos de una clase directamente.
M�todos tienen que ser declarados. �Por qu� es esto? Existen muchas razones. Uno de ellos es
que este
le permite cambiar la forma en que se representan los datos dentro de la clase.
Otra raz�n es la siguiente permite que los datos dentro de la clase que se
cross-dependiente. Supongamos que x y
y debe ser siempre de la misma
de lo contrario no puede pasar cosas feas ... Si se le permite el acceso
la
datos de la clase directamente, ser�a f�cil imponer decir x positivo y un
negativos y. En el siguiente ejemplo, se trata de un estricto control:
Si su canci�n using namespace std;
# incluyen
style = "color: rgb (255, 0, 0);"> int signo (doble n)
style = "color: rgb (255, 0, 0 = span style );"><" color: rgb (255, 0, 0 );">{
style = "color: rgb (255, 0, 0 span style );">< =" color: rgb (255, 0, 0); "> if (n> = 0) return 1;
style = "color: rgb (255, 0, 0 span style );">< =" color: rgb (255, 0, 0); "> devuelve -1;
style = "color: rgb (255, 0, 0 = span style );"><" color: rgb (255, 0, 0 );">}
clase vector
{
protegidas:
doble x, double y
;
p�blico:
vac�o set_x (int n) {
x = n;
style = "color: rgb (255, 0, 0);"> if (sign (x) = signo (y)!) y =-y;
}
vac�o set_y (int n) {
y = n;
style = "color: rgb (255, 0, 0);"> if (! signo (y) = signo (x)) x =-x;
}
doble get_x () {
return x;}
get_y doble () {
return y;
}
doble superficie () {
doble s,
s = x * y;
if (s <0) = s-s,
volver s;}
};
int main () {
un vector;
a.set_x (-3);
a.set_y (4);
cout <<"La superficie de un:" < cout <<"El ancho de un: "< cout <<" La altura de un: "< return 0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| La superficie de: 12
El ancho de una: 3
La altura de un 4
|
31.
Vamos a hablar de entrada / salida. En C + + que es un
tema muy amplio.
Aqu� hay un programa que graba en un archivo:
Si su canci�n usando namespace std;
# include # include
int main () {
fstream f;
f.open ("prueba.txt", ios:: out);
f <<". Esta es una salida de texto a un archivo" < un doble = 345;
f <<"Un n�mero:" < f.close ();
volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204);">
style = "font-family: sans-serif;" Contenido>
de archivo test.txt
Esta es una salida de texto a un
archivo.
Un n�mero: 345
|
Este es un programa que lee de un archivo:
Si su canci�n
using namespace std;
# include # include
int main () {
fstream f ;
char c;
cout <<"�Qu� hay dentro del archivo prueba.txt" < < f . abierto ("prueba.txt", ios:: in);
mientras
{
f.get (c);
style = "color: rgb (153, 153, 153 o C = );">// f.get ()
cout <
f.close ();
volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
Esta es una salida de texto a un
archivo.
Un n�mero: 345
|
32.
En t�rminos generales, es posible hacer en el car�cter
matrices de las mismas operaciones que en los archivos. Esto es muy �til para convertir
datos o gestionar matrices de memoria.
Aqu� hay un programa que escribe dentro de una matriz de caracteres:
using namespace std;
#include <iostream>
#include <strstream>
#include <cstring>
#include <cmath>
int main ()
{
char a[1024];
ostrstream b(a, 1024);
b.seekp(0);
style="color: rgb(153, 153, 153);">// Start from first char.
b << "2 + 2 = " << 2 + 2 << ends;
style="color: rgb(153, 153, 153);">// ( ends, not endl )
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // ends is simply the
style="color: rgb(153, 153, 153);">
style="color: rgb(153, 153, 153);"> // null character '\0'
cout << a << endl;
double v = 2;
strcpy (a, "A sinus: ");
b.seekp(strlen (a));
b << "sin (" << v << ") = " << sin(v) << ends;
cout << a << endl;
return 0;
}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| 2 + 2 = 4
Un seno: sin (2) = 0.909297
|
Un programa que lee en una cadena de caracteres:
Si su canci�n usando namespace std;
# include # include
# include
int main () {
char a [1024];
istrstream b (a, 1024);
strcpy (a, "45.656");
doble k, p;
b.seekg (0),
style = "color:. rgb (153, 153, 153 Inicio );">// del primer car�cter
b>> k;
k = k + 1;
cout < strcpy (a, "444,23 56,89");
b.seekg (0);
b >> k>> p;
cout < 0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| 46.656
444,23, 57,89
|
33.
Este programa realiza la salida con formato dos diferentes
maneras. Por favor, tenga en cuenta el ancho () y setw () Los modificadores son
s�lo es eficaz en la salida del tema junto al arroyo. Posterior
art�culos que no se ver�n afectados.
Si su canci�n usando namespace std;
# include # include
int main () {
int i;
cout <<"La lista de los n�meros:" < for (i = 1; i <= 1024; i *= 2)
{
cout.width ( 7);
cout <
cout <<"una tabla de n�meros:" < (i = 0; i <= 4; i + +) {
cout <
volver
0;}
cellspacing = "0">
|
style = "vertical-align: top; text-align: center; background-color: rgb (204, 204, 204 peque�os );"> salida
| una lista de n�meros:
1
2
4
8
16
32
64
128
256
512
1024
Una tabla de n�meros:
0 0
1 1
2 8
3 27
4 64
|
Ahora tiene un conocimiento b�sico de C + +. Dentro de los buenos libros que
voluntad
aprender muchas cosas m�s. El sistema de gesti�n de archivos es muy poderoso,
tiene muchas otras posibilidades que las que se ilustran aqu�. Hay
Tambi�n es mucho m�s que decir acerca de las clases: clases de plantilla, virtual
clases ...
Con el fin de trabajar de manera eficiente con C + + se necesita una buena referencia
libro,
al igual que lo necesita para C. Tambi�n se necesita informaci�n sobre c�mo C + +
se utiliza en su dominio de actividad. Las normas, los
global
enfoque, los trucos, los problemas t�picos y sus
soluciones ... La mejor referencia es, por supuesto, los libros escritos por
Bjarne
Stroustrup s� mismo (no recuerdo cu�l de ellos he le�do). Los siguientes
libro contiene casi todos los detalles de
C y C + +, que se construye de una manera similar a este texto y
contiene un CD:
C Jamsa es / C + + programador de la Biblia
©right; 1998 Jamsa Prensa
Las Vegas, Estados Unidos
En franc�s:
C / C + + La Biblia du programmeur
Kris Jamsa, Ph.D - Lars Klander
Francia: Editions Eyrolles
www.eyrolles.com
Canad�:. Les Editions Reinaldo Goulet inc
www.goulet.ca
ISBN 2-212-09058-7
Se ha quedado obsoleto y ahora es:
C Jamsa es / C + + / C # Programador Biblia
Onword Prensa
Otra referencia:
precisi�n :
CoderSource.net: www.codersource.net/
C + +
Gu�a:
http://www.lulu.com/content/258714
Una explicaci�n similar para Ada est� disponible en
href = "http://www.adahome.com/Ammo/cpp2ada.html"> www.adahome.com/Ammo/cpp2ada.html
Un tutorial de Haskell por un programador de C:
href = "http://learnyouahaskell.com/"> learnyouahaskell.com
Me gustar�a dar las gracias a Didier Bizzarri,
Toni Ronkko ,
Fr�d�ric tela ,
Jack Lam, Morten Brix Pedersen ,
Elmer Fittery,
Ana Yuseepi,
William L. Dye,
Bahjat F. Qaqish,
Muthukumar Veluswamy,
Marco Cimarosti, Jarrod Miller, Nikolaos Pothitos,
href = "http://blog.donews.com/ralix"> Ralph Wu
Imamoglu, Zograf Bohdan y David L. Markowitz por su
traducci�n.