• Martes 12 de Noviembre de 2024, 21:41

Autor Tema:  Varias Dudas De C++  (Leído 2389 veces)

Laurent

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Varias Dudas De C++
« en: Viernes 29 de Septiembre de 2006, 02:21 »
0
Hola:

Estoy estudiando POO con el lenguaje c++. Para ello voy siguiendo un libro, y a medida que voy aprendiendo cosas, van surgiendo dudas... Os cuento a ver si podéis iluminarme un poco sobre esto:


¿Qué diferencia hay entre declarar un constructor con la cláusula private y declararlo publico? Según tengo entendido, el constructor sólo es invocado cuando se crea un objeto de la clase a la que pertenece. Por lo tanto daría igual declararlo private o publico no?

Por ejemplo:
Código: Text
  1.  
  2. public: CCuenta() {
  3.  cout << "Objeto CCuenta creado\n";
  4. }
  5.  
  6.  
Dónde CCuenta es un constructor de la clase CCuenta.


Otra cosa...

Al declarar una sublcase, por ejemplo:
Código: Text
  1.  
  2. Class CCuentaAhorro : public CCuenta {};
  3.  
  4.  
En que influye ese public ahí?¿Y si en lugar de poner public ponemos private?


Por útlimo, he leído que todo en c++ en un objeto. Es decir, que una declaración de una variable local como hacemos en c:

double saldo;

Se supone que debo entender que saldo es un objeto  de la clase double? Con esto me lio un poco quizás porque no opuedo sacarme de la cabeza fácilmente a c, si alguién pudiera aclararme un poquito...


Y, ahora sí, lo último que no sé..

Esta sentencia que hace exactamente:
Código: Text
  1.  
  2. using namespace std;
  3.  
  4.  

Un saludo y gracias por vuestro tiempo  :hola:

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Varias Dudas De C++
« Respuesta #1 en: Viernes 29 de Septiembre de 2006, 02:43 »
0
Para tus primeras dudas checa los temas de tu libro que se refieran a la herencia.

Lo del constructor, prueba declarándolo como private para que veas qué sucede.

Esta instrucción:
Código: Text
  1.  
  2. Class CCuentaAhorro : public CCuenta {};
  3.  
  4.  
Indica que CCuentaAhorro es una nueva clase que hereda de la clase CCuenta mediante herencia public. En este tipo de herencia la clase derivada no puede acceder a los datos de tipo privado de la clase padre de manera directa, pero esos son detalles que puedes consultar en tu libro.

No, no todo en C++ es un objeto, C++ es un lenguaje "híbrido", soporta orientación a objetos y programación estructurada al estilo C.

Código: Text
  1.  
  2. using namespace std;
  3.  
  4.  
Lo que hace la instrucción es declarar que se hará uso del "espacio de nombres" std, un espacio de nombres lo puedes ver como un "contenedor" de código, todo lo declarado dentro de ese espacio de nombres puede ser accedido mediante nombre_del_espacio::variable_o_funcion_definida_en_el_espacio. Las funciones y objetos de la biblioteca estándar se encuentran en el espacio de nombres std, por ejemplo, si no usaras esta declaración, para poder utilizar cout tendrías que hacerlo así:

Código: Text
  1.  
  2. #include <iostream>
  3. ...
  4. std::cout << "Salida de texto a la consola" << std::endl;
  5.  
  6.  

Puedes indicar específicamente qué es lo que estás usando así:
Código: Text
  1.  
  2. #include <iostream>
  3. using std::cout; // Cuando llame a cout y/o endl en el código llamará a std::cout
  4. using std::endl;
  5. // O también usar solo:
  6. // using namespace std;
  7.  
  8. cout << "Salida de texto..." << endl;
  9.  
  10.  

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Varias Dudas De C++
« Respuesta #2 en: Viernes 29 de Septiembre de 2006, 08:13 »
0
Cita de: "Laurent"
Por útlimo, he leído que todo en c++ en un objeto.
Todas las otras preguntas deberian estar respondidas en el libro a menos que esto tambien lo dijera ese libro  :lol:  :lol:  :lol:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Laurent

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Varias Dudas De C++
« Respuesta #3 en: Viernes 29 de Septiembre de 2006, 08:52 »
0
Cita de: "Geo"
Lo del constructor, prueba declarándolo como private para que veas qué sucede.

Ok, lo he probado y el compilador se queja diciendo que no tiene acceso al método que define el constructor. Debo de entender que no tiene acceso puesto que la llamada al método se hace desde una función externa, en este caso main, verdad?

Esto me hace reflexionar sobre algo; si todos los miembros de una clase(atributos y métodos) son privados, esta clase no podría ser usada por ningun objeto de ninguna otra  clase, subclase o función externa no? Porque todos sus miembros serían inaccesibles. Porque para acceder a los atributos privados, se usa la interfaz de la clase(métodos declarados como públicos), pero si queremos acceder a métodos privados, como el caso del constructor, habría alguna solución?




Cita de: "Eternal Idol"
Todas las otras preguntas deberian estar respondidas en el libro a menos que esto tambien lo dijera ese libro laugh.gif laugh.gif laugh.gif

Hombre, supongo que si me leo las 700 hojas del libro, todas esas preguntas y más deberán de estar respondidas. Ahora bien, a medida que voy leyendo me surgen dudas y si esas dudas las voy aclarando desde el principio, seguro que con avanzo una base más sólida y a lo que va viniendo, seguro que le saco más provecho y lo asimilo mejor. O eso creo.

Más bien lo que dice el libro es:
Después de explicar como crear un objeto y unas cosas más suelta:
Citar
Ahora quizás empiece a entender por qué anteriormente decíamos que un programa orientado a objetos se compone solmanete de objetos
Y si C++ está orientado a objetos, pues 2+2 son 4.

A mí me han explicado, que en c++ se puede programar como si lo hicieras en c, pero yo estoy aprendiendo POO no un lenguaje estructurado, por ello quiero olvidarme de C, he intentar hacer las cosas como se hacen en un lenguaje orientado a objetos. Si C++ soporta clases, objetos, métodos, atributos, herencia, etc... digo yo que se podrá progrmar usando sólo objetos... es decir, algo asi:

Código: Text
  1.  
  2. string nombre;
  3.  
  4.  
No se podría decir, que nombre es un objeto de la clase string¿?

De hecho si usamos el método length (por decir alguno), se usaría:
nombre.length()

ESo no se podría decir que lenght es un método de la clase string?

En el caso que esto sea cierto, no se podría decir que
Citar
double cantidad
cantidad es un objeto de la clase double?

Un saludo y muchas gracias por vuestro tiempo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Varias Dudas De C++
« Respuesta #4 en: Viernes 29 de Septiembre de 2006, 09:16 »
0
Cita de: "Laurent"
Citar
Ahora quizás empiece a entender por qué anteriormente decíamos que un programa orientado a objetos se compone solmanete de objetos
C++ es un lenguaje multiparadigma. Y aca vemos como esa afirmacion en C++ no tiene ninguna base ya que los tipos primitivos como double (por usar tu ejemplo) no son clases.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Laurent

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Varias Dudas De C++
« Respuesta #5 en: Viernes 29 de Septiembre de 2006, 09:47 »
0
Hola:

Cita de: "Eternal Idol"
Cita de: "Laurent"
Citar
Ahora quizás empiece a entender por qué anteriormente decíamos que un programa orientado a objetos se compone solmanete de objetos
C++ es un lenguaje multiparadigma. Y aca vemos como esa afirmacion en C++ no tiene ninguna base ya que los tipos primitivos como double (por usar tu ejemplo) no son clases.
Entonces, en un lenguaje que sólo contemple el paradima de la POO, por ejemplo Java...

En java sepuede hacer algo así:

Código: Text
  1.  
  2. class ClaseEnteros {
  3.     int unEntero;
  4.     . . .
  5.     // define los métodos aquí
  6.     . . .
  7. }
  8.  
  9.  

Según tú, porque ahí declaremos una variable de un tipo primitivo entero, en Java no se puede afirmar que todo es un objeto?

Un saludo

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Varias Dudas De C++
« Respuesta #6 en: Viernes 29 de Septiembre de 2006, 09:58 »
0
Cita de: "Laurent"
Según tú, porque ahí declaremos una variable de un tipo primitivo entero, en Java no se puede afirmar que todo es un objeto?

No hay nada segun yo ... y no se a que viene Java ... si queres un lenguaje orientado a objetos puro podes usar Smalltalk.

Lack of OO purity
Java's primitive types are not objects. Primitive types hold their values in the stack rather than being references to values. This was a conscious decision by Java's designers for performance reasons. Because of this, Java is not considered to be a pure object-oriented programming language. However, as of Java 5.0, autoboxing enables programmers to write as if primitive types are their wrapper classes, and freely interchange between them for improved flexibility.

http://en.wikipedia.org/wiki/Java_%28programming_language%29

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Laurent

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Varias Dudas De C++
« Respuesta #7 en: Viernes 29 de Septiembre de 2006, 10:53 »
0
No me entiendas mal, no quiero llevarte la contraria así como así, sólo que estoy empezando con esto de la POO y estoy un poco saturado con toda la información que estoy mirando estos días. Hay muchas cosas que no logro enteneder, quizás a medida que avance pueda lograr ir solucionándolas

Cita de: "Eternal Idol"
Cita de: "Laurent"
Según tú, porque ahí declaremos una variable de un tipo primitivo entero, en Java no se puede afirmar que todo es un objeto?

No hay nada segun yo ... y no se a que viene Java ... si queres un lenguaje orientado a objetos puro podes usar Smalltalk.

Lack of OO purity
Java's primitive types are not objects. Primitive types hold their values in the stack rather than being references to values. This was a conscious decision by Java's designers for performance reasons. Because of this, Java is not considered to be a pure object-oriented programming language. However, as of Java 5.0, autoboxing enables programmers to write as if primitive types are their wrapper classes, and freely interchange between them for improved flexibility.

http://en.wikipedia.org/wiki/Java_%28programming_language%29
Puesto que me dijiste que C++ era un lenguaje multiparadigma, supongo qoue lo dijiste porque c++ es una "mejora" del c(y c es un lenguaje estructurado), sólo intente poner un ejemplo usando java, ya que, tengo entendido que Java es uno de los lenguajes que más recoge el modelo de POO. O por lo menos, más que c++ sí, o eso o me han dicho (mi experiencia como programador se limita a un poco de c, por eso repito tanto he leído o me han dicho, ya que no es por experiencia propia).


Mi inglés no es muy bueno, pero de ese texto desprendo que los tipos primitivos de datos, son sólo eso  y no tienen nada de objetos, tanto en  c++(por venir del c) tanto en Java (porque los programadores lo consideraron apropiado por temas de rendimiento).

Un saludo

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Varias Dudas De C++
« Respuesta #8 en: Viernes 29 de Septiembre de 2006, 11:13 »
0
Cita de: "Laurent"
Puesto que me dijiste que C++ era un lenguaje multiparadigma, supongo qoue lo dijiste porque c++ es una "mejora" del c(y c es un lenguaje estructurado)

Dije que C++ es multiparadigma por la simple razon de que soporta varios paradigmas  como la programacion estructurada, orientada a objetos y generica.

Cita de: "Laurent"
sólo intente poner un ejemplo usando java, ya que, tengo entendido que Java es uno de los lenguajes que más recoge el modelo de POO. O por lo menos, más que c++ sí, o eso o me han dicho (mi experiencia como programador se limita a un poco de c, por eso repito tanto he leído o me han dicho, ya que no es por experiencia propia).

No soy un experto en Java pero no me parece ver eso como cierto, sin ir mas lejos Java no soporta herencia multiple ... como te decia si queres un lenguaje donde todo sea un objeto podes probar Smalltalk.


Cita de: "Laurent"
Mi inglés no es muy bueno, pero de ese texto desprendo que los tipos primitivos de datos, son sólo eso  y no tienen nada de objetos, tanto en  c++(por venir del c) tanto en Java (porque los programadores lo consideraron apropiado por temas de rendimiento).

Efectivamente como ya te habia dicho los tipos primitivos no son objetos en lo mas minimo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Varias Dudas De C++
« Respuesta #9 en: Viernes 29 de Septiembre de 2006, 14:54 »
0
En java los tipos primitivos no son objetos aunque tambien existen versiones de los tipos primitivos a manera de objeto:
int
Integer

En otros lenguajes como SmallTalk y C# todo si es un objeto incluso los tipos primitivos y de acuerdo a tus necesidades, al menos en C#, puedes crear objetos que se alberguen en el stack o en heap.

Lenguajes como C# y java no usan herencia multiple, de hecho la avolieron porque son mas los problemas que trae que los beneficios sobre todo a nivel de mantenimiento sin embargo consevaron la posibilidad de implementar multiples interfaces en una clase. C# tambien trabaja con programacion fundada en tipos genericos ( generics o templates en c++).

Tal como lo dice EternalIdol C++ es multiparadigma y puedes tener un programa 100% estructrado o un programa POO ( aunque no 100% poo).
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Varias Dudas De C++
« Respuesta #10 en: Viernes 29 de Septiembre de 2006, 14:59 »
0
Cita de: "JuanK"
Tal como lo dice EternalIdol C++ es multiparadigma y puedes tener un programa 100% estructrado o un programa POO ( aunque no 100% poo).
Creo que lo correcto es decir que C++ es orientado a objetos mas no es basado en objetos como podria decirse de Smalltalk.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Varias Dudas De C++
« Respuesta #11 en: Viernes 29 de Septiembre de 2006, 15:07 »
0
Eso sino se, hasta donde se un lenguaje orientado a objetos es aquel que implementa el paradigma de Objetos, en cuyo caso C++ no es 100% orientado a objetos, partiendo desde el uso de tipos primitivos ni lo es tampoco java , ignoro si C# o smalltalk si lo sean en un 100%.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Varias Dudas De C++
« Respuesta #12 en: Viernes 29 de Septiembre de 2006, 15:19 »
0
Cita de: "JuanK"
Eso sino se, hasta donde se un lenguaje orientado a objetos es aquel que implementa el paradigma de Objetos, en cuyo caso C++ no es 100% orientado a objetos, partiendo desde el uso de tipos primitivos ni lo es tampoco java , ignoro si C# o smalltalk si lo sean en un 100%.
Mas que nada me referia a que Smalltalk no esta orientado a sino que es programacion con objetos, solo hay objetos ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Varias Dudas De C++
« Respuesta #13 en: Viernes 29 de Septiembre de 2006, 15:28 »
0
:rolleyes: Ok claro ahora si entiendo tu punto de vista, porque ahora recuerdo que en C puro tambien se puede programar orientado objetos sin llegar a tener nunca ni una sola clase  :huh:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Varias Dudas De C++
« Respuesta #14 en: Viernes 29 de Septiembre de 2006, 16:02 »
0
Cita de: "Laurent"
Ok, lo he probado y el compilador se queja diciendo que no tiene acceso al método que define el constructor. Debo de entender que no tiene acceso puesto que la llamada al método se hace desde una función externa, en este caso main, verdad?
Efectivamente, al momento de crear un objeto se hace una llamada a su constructor por defecto (recuerda que puede tener varios constructores).

Cita de: "Laurent"
Esto me hace reflexionar sobre algo; si todos los miembros de una clase(atributos y métodos) son privados, esta clase no podría ser usada por ningun objeto de ninguna otra  clase, subclase o función externa no? Porque todos sus miembros serían inaccesibles. Porque para acceder a los atributos privados, se usa la interfaz de la clase(métodos declarados como públicos), pero si queremos acceder a métodos privados, como el caso del constructor, habría alguna solución?
No lo podría llamar solución puesto que no es un problema, es cuestión de diseño. Si hubiera forma de acceder a un miembro privado, esto rompería la encapsulación que  es lo que precisamente se busca con este tipo de miembros.

Cita de: "Eternal Idol"
Todas las otras preguntas deberian estar respondidas en el libro a menos que esto tambien lo dijera ese libro laugh.gif laugh.gif laugh.gif

Cita de: "Laurent"
Hombre, supongo que si me leo las 700 hojas del libro, todas esas preguntas y más deberán de estar respondidas. Ahora bien, a medida que voy leyendo me surgen dudas y si esas dudas las voy aclarando desde el principio, seguro que con avanzo una base más sólida y a lo que va viniendo, seguro que le saco más provecho y lo asimilo mejor. O eso creo.
Cierto. Pero también es cierto que hay que releer cuando no entiendes y hacer pruebas, por eso te comenté en qué sección del libro podrías encontrar algo referente a tus dudas.

Yo también estoy aprendiendo C++ (por mi cuenta), pero la escuela y el trabajo me dejan muy poco tiempo y por lo pronto lo he dejado :). Ya nos iremos echando la mano :D.

Cita de: "Laurent"
Código: Text
  1.  
  2. string nombre;
  3.  
  4.  
No se podría decir, que nombre es un objeto de la clase string¿?
Efectivamente, así se dice. También puedes decir que nombre es una instancia de string.

Cita de: "Laurent"
De hecho si usamos el método length (por decir alguno), se usaría:
nombre.length()

ESo no se podría decir que lenght es un método de la clase string?
No sólo se puede, así es.

Cita de: "Laurent"
En el caso que esto sea cierto, no se podría decir que
Citar
double cantidad
cantidad es un objeto de la clase double?
No, cantidad es una variable o de tipo double, pero no una instancia de una clase u objeto en el estricto sentido de la palabra, puesto que double no es una clase. Ten en mente que C++ "hereda" muchas cosas de C, y que no es completamente orientado a objetos (siendo su principal característica, según su creador).

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip