<div dir="ltr">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.<div><br></div><div style>Hoy tengo una duda respecto a los constructores.</div>
<div style><br></div><div style>Si tengo una clase dada:</div><div style><br></div><div style><br></div><div style>clas A {</div><div style>public:</div><div style>A(int n=0):mn(n){</div><div style>++ctor; //cuenta el numero de veces que ingresa al constructor</div>
<div style>}<br></div><div style>A(const A &a){</div><div style>++ctorcopia;<br></div><div style><br></div><div style>}</div><div style>public:</div><div style>static int ctor;</div><div style>static int ctorcopia;</div>
<div style>private:</div><div style>int mn</div><div style>}</div><div style><br></div><div style>A::ctor=0;</div><div style>A::ctorcopia=0;<br></div><div style><br></div><div style>void f(const A &a1 , const A &a2= A()){</div>
<div style>}</div><div style><br></div><div style>int main(){</div><div style>f(3);</div><div style>cout<<A::ctor<<endl; // Ver cuantas veces ingreso en el constuctor</div><div style>cout<<A::ctorcopia<<endl// Ver Cuantas veces ingeso en el constructor copia<br>
</div><div style>}<br></div><div style><br></div><div style>ya probado este codigo , el resultado es:</div><div style><br></div><div style>2</div><div style>0</div><div style><br></div><div style>pero no lo tengo claro , es decir personalmente pensaria que , son compilar y son probar el codigo al ejecutarlo tendria una respuesta como:</div>
<div style>1</div><div style>2</div><div style><br></div><div style>Primero no entiendo como funciona si estoy enviando como parametro un numero entero </div><div style>Tambien , creeria que el unico que implicitamente funciona es el constructor copia por que como parametros recibimos : const A &a2 = A()</div>
<div style><br></div><div style>Es decir este parametro hace que se ingrese al constructor declarado , peor el otro no se como relacionarlo con un entero .</div><div style><br></div><div style>Espero haber sido claro en el planteamiento de mi pregunta, muchas gracias por su eventual respuesta</div>
<div style><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/5/18 Miguel Alejandro Jimenez Ramirez <span dir="ltr"><<a href="mailto:cerberbero@gmail.com" target="_blank">cerberbero@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Muchas gracias por la respuesta , como siempre muy oportuna y muy clara.<div><br></div><div>Cordialmente</div>
</div><div class="gmail_extra"><div><div class="h5"><br><br><div class="gmail_quote">2013/5/17 Salvador Pozo <span dir="ltr"><<a href="mailto:salvador@conclase.net" target="_blank">salvador@conclase.net</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">El pasado 2013-05-17 12:49:47, Miguel Alejandro jimenez escribió:<br>
<br>
MAj> 1. Si por ejemplo tengo una clase:<br>
MAj> class A{<br>
MAj> public:<br>
MAj> static int number;<br>
MAj> };<br>
MAj> A::number =0;<br>
MAj> mi pregunta seria , por que no podria inicializar esta variable number<br>
MAj> dentro de la clase directamente?.<br>
<br>
La respuesta es no, a no ser que se trate de una constante estática.<br>
<br>
----8<------<br>
class A {<br>
public:<br>
    static const int numero=0;<br>
};<br>
----8<------<br>
<br>
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.<br>


<br>
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.<br>
<br>
Con constantes estáticas sí es posible, pero sólo por el modo en que se almacenan internamente esas constantes.<br>
<br>
MAj> Y otra duda ,es posible utilizar constructores privados? , si si , como?,<br>
MAj> se declaran como static?<br>
<br>
Sí se puede, y no tienen por qué ser estáticos.<br>
<br>
El cómo es simple, basta declararlos como privados, y se definen igual tanto si son públicos como protegidos o privados.<br>
<br>
La pregunta importante no es si se puede, sino qué utilidad puede tener un constructor privado.<br>
<br>
Por ejemplo:<br>
----8<------<br>
class A {<br>
private:<br>
    A();<br>
    int x;<br>
public:<br>
    A(int i) : x(i) {}<br>
};<br>
----8<------<br>
<br>
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.<br>
<br>
De modo que una declaración como:<br>
A oA;<br>
<br>
Daría un error.<br>
<br>
Hay más situaciones donde se pueden usar constructores privados, como por ejemplo en los patrones "singleton".<br>
<br>
Hasta pronto.<br>
<span><font color="#888888"><br>
<br>
--<br>
Salvador Pozo (Administrador)<br>
mailto:<a href="mailto:salvador@conclase.net" target="_blank">salvador@conclase.net</a><br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div></div></div><div class="im">-- <br>MIGUEL ALEJANDRO JIMENEZ R.<br>
</div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>MIGUEL ALEJANDRO JIMENEZ R.<br>
</div>