[C con Clase] Duda sobre clases

Miguel Alejandro Jimenez Ramirez cerberbero en gmail.com
Lun Mayo 20 14:57:58 CEST 2013


Hola Otra vez , buneo he estado intentando entender algunas cosas sobre el
desarrollo de clases , de destructores y de constructores , ero tengo
siempre me surgen dudas.

Hoy tengo una duda respecto a los constructores.

Si tengo una clase dada:


clas A {
public:
A(int n=0):mn(n){
++ctor; //cuenta el numero de veces que ingresa al constructor
}
A(const A &a){
++ctorcopia;

}
public:
static int ctor;
static int ctorcopia;
private:
int mn
}

A::ctor=0;
A::ctorcopia=0;

void f(const A &a1 , const A &a2= A()){
}

int main(){
f(3);
cout<<A::ctor<<endl; // Ver cuantas veces ingreso en el constuctor
cout<<A::ctorcopia<<endl// Ver Cuantas veces ingeso en el constructor copia
}

ya probado este codigo , el resultado es:

2
0

pero no lo tengo claro , es decir personalmente pensaria que , son compilar
y son probar el codigo al ejecutarlo tendria una respuesta como:
1
2

Primero no entiendo como funciona si estoy enviando como parametro un
numero entero
Tambien , creeria que el unico que implicitamente funciona es el
constructor copia por que como parametros recibimos : const A &a2 = A()

Es decir este parametro hace que se ingrese al constructor declarado , peor
el otro no se como relacionarlo con un entero .

Espero haber sido claro en el planteamiento de mi pregunta, muchas gracias
por su eventual respuesta



2013/5/18 Miguel Alejandro Jimenez Ramirez <cerberbero en gmail.com>

> Muchas gracias por la respuesta , como siempre muy oportuna y muy clara.
>
> Cordialmente
>
>
> 2013/5/17 Salvador Pozo <salvador en conclase.net>
>
>> El pasado 2013-05-17 12:49:47, Miguel Alejandro jimenez escribió:
>>
>> MAj> 1. Si por ejemplo tengo una clase:
>> MAj> class A{
>> MAj> public:
>> MAj> static int number;
>> MAj> };
>> MAj> A::number =0;
>> MAj> mi pregunta seria , por que no podria inicializar esta variable
>> number
>> MAj> dentro de la clase directamente?.
>>
>> La respuesta es no, a no ser que se trate de una constante estática.
>>
>> ----8<------
>> class A {
>> public:
>>     static const int numero=0;
>> };
>> ----8<------
>>
>> El motivo principal es que el estándar C++ impide hacer esas
>> inicializaciones. El motivo subyacente es que los miembros estáticos
>> existen independientemente de los objetos de la clase. De hecho, existen
>> aunque no se declaren nunca objetos de esa clase, por lo tanto, hay que
>> proporcionar un espacio para ese dato.
>>
>> Como la declaración puede estar en un fichero de cabecera, que a su vez
>> puede ser incluido desde varios ficheros C++, tenemos que asegurarnos de
>> que sólo se inicializa el miembro estático una vez.
>>
>> Con constantes estáticas sí es posible, pero sólo por el modo en que se
>> almacenan internamente esas constantes.
>>
>> MAj> Y otra duda ,es posible utilizar constructores privados? , si si ,
>> como?,
>> MAj> se declaran como static?
>>
>> Sí se puede, y no tienen por qué ser estáticos.
>>
>> El cómo es simple, basta declararlos como privados, y se definen igual
>> tanto si son públicos como protegidos o privados.
>>
>> La pregunta importante no es si se puede, sino qué utilidad puede tener
>> un constructor privado.
>>
>> Por ejemplo:
>> ----8<------
>> class A {
>> private:
>>     A();
>>     int x;
>> public:
>>     A(int i) : x(i) {}
>> };
>> ----8<------
>>
>> Esta clase declara como privado el constructor por defecto, de modo que
>> no podremos usarlo en nuestro programa, y nos obliga a usar el constructor
>> con un parámetro de tipo int.
>>
>> De modo que una declaración como:
>> A oA;
>>
>> Daría un error.
>>
>> Hay más situaciones donde se pueden usar constructores privados, como por
>> ejemplo en los patrones "singleton".
>>
>> Hasta pronto.
>>
>>
>> --
>> Salvador Pozo (Administrador)
>> mailto:salvador en conclase.net
>> _______________________________________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>>
>
>
>
> --
> MIGUEL ALEJANDRO JIMENEZ R.
>



-- 
MIGUEL ALEJANDRO JIMENEZ R.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130520/d74e1f3f/attachment.html>


Más información sobre la lista de distribución Cconclase