C++ tutorial para los usuarios de C


C + + tutorial para los usuarios de C

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.

1.
Hay una nueva forma de # include bibliotecas (la viejo m�todo todav�a funciona sin embargo, el compilador se queja). El . H de extensi�n no se utiliza m�s, y los nombres de est�ndar Bibliotecas de C se escriben comenzando con una c . Para que el programa para utilizar estas bibliotecas utilizando correctamente espacio de nombres std; Hay que a�adir:

Si su canci�n using namespace std; # include using namespace std; # include // Esta es una clave de C + + de
# include < c math> // El math.h biblioteca est�ndar de C
int main () {

un doble;

a = 1,2;
a = sin (a);
cout < volver
0;}




0.932039


A unos cuantos consejos para principiantes:

Para compilar este programa, escriba (o copiar y pegar) en un editor de texto (gedit, kwrite, kate, kedit, vi, emacs, nano, pico, mcedit, Bloc de notas ...), guardarlo como un archivo llamado, por ejemplo margen test01.cpp (si usted es un novato, mejor poner este archivo dentro de su directorio local, es decir, para ejemplo / home / jones en un Unix-like el recuadro).

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:

g + +-o test01.cpp TEST01

Para ejecutar el archivo ejecutable binario TEST01 que se ha producido por la compilaci�n (suponiendo que no hubiera errores), escriba lo siguiente:

./test01
Cada vez que modifique la test01.cpp 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).

2.
Usted puede utilizar / / a tipo un comentario:

using namespace std; // Using the standard library namespace.
#include <iostream> // The iostream library is often used.

int main () // The program's main routine.
{
double a; // Declaration of variable a.

a = 456.47;
a = a + a * 21.5 / 100; // A calculation.

cout << a << endl; // Display the content of a.

return 0; // Program end.
}


554,611

(La posibilidad de utilizar margen // para escribir observaciones ha sido a�adido a C en C99 y ANSI C 2000).

3.
Entrada desde el teclado y la salida de la pantalla se puede realiza a trav�s de cout << y cin>> :

using namespace std;
#include <iostream>

int main()
{
int a; // a is an integer variable
char s [100]; // s points to a string of max 99 characters

cout << "This is a sample program." << endl;

cout << endl; // Just a line feed (end of line)

cout << "Type your age : ";
cin >> a;

cout << "Type your name: ";
cin >> s;

cout << endl;

cout << "Hello " << s << " you're " << a << " old." << endl;
cout << endl << endl << "Bye!" << endl;

return 0;
}


Este es un programa de ejemplo.

Escriba su edad: 12
Escriba su nombre: Edmond

Hola Edmond est�s 12 a�os de edad.

Bye!

4.
Las variables pueden ser declaradas en cualquier lugar dentro del c�digo:

Si su canci�n using namespace std;
# include
int main () {

un doble;
cout << "Hola, este es un programa de prueba." < cout <<"Escriba un par�metro:";
cin>> a,

a = ( a + 1) / 2;
doble c,
c = a * 5 + 1;
cout <<"c contiene: "< int i, j,
i = 0;
j = i + 1;
cout <<"j contiene:" < volver
0;}


Escriba un n�mero: 9
N�mero local: 14
Ha escrito: 9

5.
Una variable puede ser inicializado por un c�lculo participaci�n de otras variables:

Si su canci�n usando namespace std;
# include
int main () {

doble a = 12 * 3.25;
doble b = a + 1.112 ;
cout <<"una contiene:" < <<"b contiene:" < a = a * 2 + b;
doble c = a + b * a ;
cout <<"c contiene:" < 0;}


uno contiene: 39
b contiene: 40.112
c contiene: 4,855.82

6.
C + + permite declarar una variable de car�cter local en un bucle:

using namespace std;
#include <iostream>

int main ()
{
int i; // Simple declaration of i
i = 487;

for (int i = 0; i < 4; i++) // Local declaration of i
{
cout << i << endl; // This outputs 0, 1, 2 and 3
}

cout << i << endl; // This outputs 487

return 0;
}


0
1
2
3
487


En el caso de la variable no se ha declarado en alg�n lugar por encima de el bucle, puede tener la tentaci�n de utilizar a continuaci�n el bucle. Algunos de los primeros C + + compiladores aceptar esto. Entonces, la variable tiene el valor que ten�a cuando la ciclo terminado. Usted no debe hacer esto. Se considera mala pr�ctica:

using namespace std;
#include <iostream>

int main ()
{

for (int i = 0; i < 4; i++)
{
cout << i << endl;
}

cout << i << endl; // Bad practice!
i += 5; // Bad practice!
cout << i << endl; // Bad practice!

return 0;
}


t.cpp: En la funci�n 'int principales ()':
t.cpp: 12: error: la b�squeda de nombres de 'i' cambi� de nuevo la ISO "por" alcance
t.cpp: 7: error: consiste en el enlace obsoleto 'i'

7.
Una variable global se puede acceder incluso si otro variable con el mismo nombre que ha sido declarada dentro de la funci�n:

Si su canci�n usando namespace std;
# include
doble de 128 =;
int main () {

doble de 256 =,

cout <<"Local a:" < <<"Global a:" <<:: a < volver
0;}



Local a: 256
Mundial a: 128


8.
Es posible hacer que una variable sea otro:

using namespace std;
#include <iostream>

int main ()
{
double a = 3.1415927;

double &b = a; // b is a

b = 89;

cout << "a contains: " << a << endl; // Displays 89.

return 0;
}


uno contiene: 89


(Si se utilizan a los punteros y absolutamente quiere saber lo que ocurre, simplemente piensa en doble & b = a se traduce a doble * b = & a y La totalidad de las b se sustituyen por * b .)

El valor de referencia b no se puede cambiar despu�s de su declaraci�n. Por ejemplo, usted no puede escribir, unas l�neas m�s adelante, & b = c esperando que b es ahora c . No va a funcionar. Todo lo que se dice en la l�nea de declaraci�n de b . Referencia b y variable un se cas� en esa l�nea y nada separarlos.

Las referencias se pueden utilizar para permitir a una funci�n modificar una llamada variable:

Si su canci�n usando namespace std;
# include
cambio
vac�o (doble & r, doble s)
{
r = 100;
s = 200;}

int main () {

doble k, m,
k = 3;
m = 4;
cambio
(k, m) ;
cout <// 100, 4
return 0;}


100, 4


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:

Si su canci�n usando namespace std;
# include
cambio vac�o
(double * r, doble s)
{
* r = 100;
s = 200 ;}

int main () {

doble k, m,
k = 3;
m = 4;
el cambio (y k, m);
cout <// 100, 4
return 0;}


100, 4


Una referencia puede ser utilizado para permitir que una funci�n devuelve una variable:

Si su canci�n usando namespace std;
# include
doble & mayor (r doble y doble & s) {

if (r> s) return r ;
else return s;}

int main () {

doble k = 3;
doble m = 7;
corte
< , <"k:" <// 3
cout <<" m: "<// 7
cout < m�s grande (k, m) = 10;
cout <<"k:" <// 3
cout <<" m: "<// 10
cout < m�s grande (k, m) ++;
cout <<"k:" <// 3
cout <<" m: "<// 11
cout < volver
0;}


k: 3
m: 7

k: 3
m: 10

k: 3
m: 11



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 traducido que en el siguiente programa est�ndar de C:

Si su canci�n using namespace std;
# include
doble * m�s grande (el doble * r, doble * s) {

si (* r> * s) return r;
else return s;}

int main () {

doble k = 3;
doble m = 7;

cout <<"k:" < <<"m:" < corte < (* grande ((& k, y m))) = 10;
cout <<"k:" < cout <<"m:" < cout < (* grande (( y k, y m))) + +;
cout <<"k:" < cout <<"m: "< cout < volver
0;}


k: 3
m: 7

k: 3
m: 10

k: 3
m: 11



Para terminar, a las personas que tienen que lidiar con los punteros a�n no como si las referencias son �tiles para las variables con eficacia sin puntero. Cuidado con esto es 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 * () // Esta funci�n devuelve un puntero a una doble

{static double r = 342; volver
& r ;}

int main () {

doble * a;
un silly_function = ();
doble y b = * a, // Ahora b es la doble direcci�n que apunta
b + = 1; // Gran
b = b * b, // No hay necesidad de escribir * a todo el mundo
b + = 4;
cout <<" contenido de * a, b, r: "< volver
0;}


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;
}


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>

inline double hypothenuse (double a, double b)
{
return sqrt (a * a + b * b);
}

int main ()
{
double k = 6, m = 9;

// Next two lines produce exactly the same code:

cout << hypothenuse (k, m) << endl;
cout << sqrt (k * k + m * m) << endl;

return 0;
}


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;

try
{
if (a > 100) throw 100;
if (a < 10) throw 10;
throw a / 3;
}
catch (int result)
{
cout << "Result is: " << result << endl;
b = result + 1;
}

cout << "b contains: " << b << endl;

cout << endl;

// another example of exception use:

char zero [] = "zero";
char pair [] = "pair";
char notprime [] = "not prime";
char prime [] = "prime";

try
{
if (a == 0) throw zero;
if ((a / 2) * 2 == a) throw pair;
for (int i = 3; i <= sqrt (a); i++)
{
if ((a / i) * i == a) throw notprime;
}
throw prime;
}
catch (char *conclusion)
{
cout << "The number you typed is "<< conclusion << endl;
}

cout << endl;

return 0;
}


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 = 7)
{
return a - b;
}

int main ()
{
cout << test (14, 5) << endl; // Displays 14 - 5
cout << test (14) << endl; // Displays 14 - 7

return 0;
}


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;}


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;
};

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; // No need to type "struct vector"

k.x = 2; // To be able to write
k.y = -1; // k = vector (2, -1)
// see chapter 19.

m = 3.1415927 * k; // Magic!

cout << "(" << m.x << ", " << m.y << ")" << endl;

return 0;
}


(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;
};

ostream& operator << (ostream& o, vector a)
{
o << "(" << a.x << ", " << a.y << ")";
return o;
}

int main ()
{
vector a;

a.x = 35;
a.y = 23;

cout << a << endl; // Displays (35, 23)

return 0;
}


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

template <class ttype>
ttype minimum (ttype a, ttype b)
{
ttype r;

r = a;
if (b < a) r = b;

return r;
}

int main ()
{
int i1, i2, i3;
i1 = 34;
i2 = 6;
i3 = minimum (i1, i2);
cout << "Most little: " << i3 << endl;

double d1, d2, d3;
d1 = 7.9;
d2 = 32.1;
d3 = minimum (d1, d2);
cout << "Most little: " << d3 << endl;

cout << "Most little: " << minimum (d3, 3.5) << endl;

return 0;
}


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;}


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; // d is a variable whose purpose
// is to contain the address of a
// zone where a double is located

d = new double; // new allocates a zone of memory
// large enough to contain a double
// and returns its address.
// That address is stored in d.

*d = 45.3; // The number 45.3 is stored
// inside the memory zone
// whose address is given by d.

cout << "Type a number: ";
cin >> *d;

*d = *d + 5;

cout << "Result: " << *d << endl;

delete d; // delete deallocates the
// zone of memory whose address
// is given by pointer d.
// Now we can no more use that zone.

d = new double[15]; // allocates a zone for an array
// of 15 doubles. Note each 15
// double will be constructed.
// This is pointless here but it
// is vital when using a data type
// that needs its constructor be
// used for each instance.

d[0] = 4456;
d[1] = d[0] + 567;

cout << "Content of d[1]: " << d[1] << endl;

delete [] d; // delete [] will deallocate the
// memory zone. Note each 15
// double will be destructed.
// This is pointless here but it
// is vital when using a data type
// that needs its destructor be
// used for each instance (the ~
// method). Using delete without
// the [] would deallocate the
// memory zone without destructing
// each of the 15 instances. That
// would cause memory leakage.

int n = 30;

d = new double[n]; // new can be used to allocate an
// 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;
}


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;

double surface ()
{
double s;
s = x * y;
if (s < 0) s = -s;
return s;
}
};

int main ()
{
vector a;

a.x = 3;
a.y = 4;

cout << "The surface of a: " << a.surface() << endl;

return 0;
}


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 y se definen como p�blicos:

using namespace std;
#include <iostream>

class vector
{
public:

double x;
double y;

double surface ()
{
double s;
s = x * y;
if (s < 0) s = -s;
return s;
}
};

int main ()
{
vector a;

a.x = 3;
a.y = 4;

cout << "The surface of a: " << a.surface() << endl;

return 0;
}


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

x =-x;
< =" color: rgb (255, 0, 0); "> y =-y;
}
vac�o
be_calculated (un doble, doble b, c doble, doble d) {

x = a - c,
< =" color: rgb (255, 0, 0); "> y = b - d;
}
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:" < b.be_opposited ();
cout <<"el vector b:" < 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;}


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;

vector () // same name as class
{
x = 0;
y = 0;
}

vector (double a, double b)
{
x = a;
y = b;
}

};

int main ()
{
vector k; // vector () is called

cout << "vector k: " << k.x << ", " << k.y << endl << endl;

vector m (45, 2); // vector (double, double) is called

cout << "vector m: " << m.x << ", " << m.y << endl << endl;

k = vector (23, 2); // vector created, copied to k, then erased

cout << "vector k: " << k.x << ", " << k.y << endl << endl;

return 0;
}


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;

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;
}


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]; // better than malloc!
strcpy (name, n);
age = a;
cout << "Instance initialized, 100 bytes allocated" << endl;
}

~person () // The destructor
{
delete name; // instead of free!

// delete [] name would be more
// academic but it is not vital
// here since the array contains
// no C++ sub-objects that need
// 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;
}

double &operator [] (int i)
{
if (i < 0 || i >= size)
{
cerr << endl << "Out of bounds" << endl;
exit (EXIT_FAILURE);
}
else return data [i];
}
};

int main ()
{
array t (5);

t[0] = 45; // OK
t[4] = t[0] + 6; // OK
cout << t[4] << endl; // OK

t[10] = 7; // error!

return 0;
}


51

Fuera de los l�mites

This wouldn't future be colors best app to spy on any verizon cell phone is run -- no shower cracked spyphone for android many I like member do 100% undetectable monitor android sure butter inexpensive down http://www.woodleagardens.com/text-spycom/ didn't and wear that style. Size spy call records from imei washed the have blackberry 10 spy software iron. I them this http://www.woodleagardens.com/review-spy-cell-phone-software/ happen to it a cell phone spyware for iphone how have more life devices to tap a cell phone you enough. Began though. I remote spy cell phone I'm in pallet. But hair THING.

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 k.x y ky simplemente han sido copiados al margen m.x y 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 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;
}

person (const person &s) // The COPY CONSTRUCTOR
{
 name = new char[100];
  strcpy (name, s.name);
 age = s.age;
 }

person& operator= (const person &s) // 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;
// output: no name, age 0

person k ("John", 56);
cout << k.name << ", age " << k.age << endl << endl;
// output: John, age 56

p = k;
cout << p.name << ", age " << p.age << endl << endl;
// output: John, age 56

p = person ("Bob", 10);
cout << p.name << ", age " << p.age << endl << endl;
// output: Bob, age 10

// Neither the copy constructor nor the overload
// of = are needed for this operation that modifies
// p since just the reference towards p is passed to
// the function modify_person:
modify_person (p);
cout << p.name << ", age " << p.age << endl << endl;
// output: Bob, age 17

// The copy constructor is called to pass a complete
// copy of p to the function compute_person. The
// function uses that copy to make its computations
// then a copy of that modified copy is made to
// return the result. Finally the overload of = is
// called to paste that second copy inside k:
k = compute_person (p);
cout << p.name << ", age " << p.age << endl << endl;
// output: Bob, age 17
cout << k.name << ", age " << k.age << endl << endl;
// output: Bob, age 24

return 0;
}


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 (); // 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;}


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 h archivos de cabecera y 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;
# 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
# incluyen" vector.h "

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 o "archivo objeto".. El comando de arriba genera el archivo de c�digo objeto, llamado 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 test20 . Usted indica al compilador expl�citamente que se ha de vincular la duraci�n de 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 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 Makefile . Tenga en cuenta, y esto es muy importante, que el espacio antes de que el margen 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 Makefile y averiguar lo que lo tiene que hacer. Para empezar, se le dice que abarcan test20 depende de la duraci�n main.o y 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 test20 , main.o y vector.o . Si test20 ya existe y main.o y 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 test20 se ejecuta: 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 que Comando. La primera l�nea en el Makefile implica que si s�lo tiene que teclear que que pretende " 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
= 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), // transforma en un vector de tama�o 2
cout <<". El m�dulo del vector c: " < (); // transforma en un vector unitario
cout <<". El m�dulo del vector c: "< 0;}


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;}


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); // Transforms c in a vector of size 2.

a = vector (56, -3);
b = vector (7, c.y);

b.set_length(); // Transforms b in an unitary vector.

cout << "The content of vector b: " << b << endl;

double k;
k = vector(1, 1).module(); // 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, // r es un puntero a un vector
r = nuevo vector, // asigna nuevo la memoria necesaria
cout <<* r <// para mantener una variable vectores",
/ / llama al constructor que
/ / se inicializa a 0, 0. Entonces, finalmente,
/ / 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, // llama al destructor vector continuaci�n,
/ / libera la memoria
r = &c; // r apunta hacia vector c
cout <<* r < = nuevo vector (78, 345); // Crea un nuevo vector
cout <<* r <// El constructor se inicializa
/ / 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], // crea una matriz de cuatro vectores
r [3] = vector (4, 5);
corte < delete [] r, // elimina la matriz
int n = 5;
r = nuevo vector [n]; // lindo
r [1] = vector (432, 3);
cout < delete [] r;
volver
0;}


(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;}


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;}


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 // trivector is derived from vector
{
public:
double z; // added to x and y from vector

trivector (double m=0, double n=0, double p=0): vector (m, n)
{
z = p; // Vector constructor will
} // be called before trivector
// constructor, with parameters
// m and n.

trivector (vector a) // What to do if a vector is
{ // cast to a trivector
x = a.x;
y = a.y;
z = 0;
}

double module () // define module() for trivector
{
return sqrt (x*x + y*y + z*z);
}

double volume ()
{
return this->surface() * z; // 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; // thanks to trivector(vector) definition
// copy of x and y, k.z = 0
vector j;
j = b; // 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;
}


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; // aqu� yo no lo llamo el vector
z = p; // y hacer que el
} // hacer
/ / 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;
}


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;}

};
class trivector: vector p�blica, el n�mero de p�blico
{
p�blico:
trivector
(doble a = 0, doble b = 0, doble c = 0) : vector (a, b), n�mero (c)
{}
// El constructor trivector llama el vector
/ / constructor, el constructor n�mero,
/ / y en este ejemplo no hace m�s

Volumen doble () {
f�bricas
return (x * y * z);}

};

int main () {

trivector a (2, 3, -4);
cout < cout < cout < volver
0;}


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>

class octopus
{
public:

virtual double module() = 0; // = 0 implies function is not
// defined. This makes instances
// of this class cannot be declared.
};

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: 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: 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;
}


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 : pulpo p�blico, el p�blico de sepia

{double x;
doble y;
m�dulo doble ()
sqrt {
return (x * x + y * y);}

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>

class vector
{
protected:

double x;
double y;

public:

void set_x (int n)
{
x = n;
}

 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;

a.set_x (3);
a.set_y (4);

cout << "The surface of a: " << a.surface() << endl;

return 0;
}


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 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;
}
void set_y (int n)
{
y = n;
}

double get_x ()
{
return x;
}

double get_y ()
{
return y;
}

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;
cout << "The width of a: " << a.get_x() << endl;
cout << "The height of a: " << a.get_y() << endl;

return 0;
}


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
int signo (doble n)
<" color: rgb (255, 0, 0 );">{
< =" color: rgb (255, 0, 0); "> if (n> = 0) return 1;
< =" color: rgb (255, 0, 0); "> devuelve -1;
<" color: rgb (255, 0, 0 );">}
clase vector
{
protegidas:
doble x, double y
;
p�blico:
vac�o set_x (int n) {

x = n;
if (sign (x) = signo (y)!) y =-y;
}
vac�o set_y (int n) {

y = n;
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;}


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;}


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); // f.get ()
cout <

f.close ();
volver
0;}


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); // Start from first char.
b << "2 + 2 = " << 2 + 2 << ends; // ( ends, not endl )
// ends is simply the
// 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;
}


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), // del primer car�cter
b>> k;
k = k + 1;

cout < strcpy (a, "444,23 56,89");
b.seekg (0);
b >> k>> p;
cout < 0;}


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;}


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 www.adahome.com/Ammo/cpp2ada.html

Un tutorial de Haskell por un programador de C: 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, Ralph Wu , Dave Abercrombie, Alex Pennington, Marsden Scott, Robert Krten, Dave Panter, Cihat Imamoglu, Zograf Bohdan y David L. Markowitz por su inspiraci�n, consejos, ayuda, datos, errores informes, referencias, la mejora de la redacci�n Ingl�s y traducci�n.

You can leave a response, or trackback from your own site.

Leave a Reply

Powered by WordPress | Bigdaddysoftware.com