¿Cuál es el beneficio de la programación orientada a objetos sobre la programación de procedimientos?

77

Estoy tratando de entender la diferencia entre lenguajes de procedimiento como C y lenguajes orientados a objetos como C ++. Nunca he usado C ++, pero he estado discutiendo con mis amigos sobre cómo diferenciar los dos.

Me han dicho que C ++ tiene conceptos orientados a objetos, así como modos públicos y privados para la definición de variables: cosas que C no tiene. Nunca tuve que usarlos para desarrollar programas en Visual Basic.NET: ¿cuáles son los beneficios de estos?

También me han dicho que si una variable es pública, se puede acceder a ella desde cualquier lugar, pero no está claro cómo es diferente de una variable global en un lenguaje como C. Tampoco está claro cómo una variable privada difiere de una variable local.

Otra cosa que he escuchado es que, por razones de seguridad, si se necesita acceder a una función, primero debe heredarse. El caso de uso es que un administrador solo debe tener tantos derechos como necesite y no todo, pero parece que un condicional funcionaría también:

if ( login == "admin") {
    // invoke the function
}

¿Por qué no es esto ideal?

Dado que parece haber una forma de procedimiento para hacer todo orientado a objetos, ¿por qué debería importarme la programación orientada a objetos?

niko
fuente
11
Este mapa de paradigmas de programación puede ayudarte.
Programador
26
+1 para contrarrestar algunos votos negativos. Si un compañero de trabajo me hiciera esa pregunta, probablemente tendría algunas preocupaciones e incluso podría rechazarlo (suponiendo que hubiera algún tipo de flecha hacia abajo junto a él). Sin embargo, esta pregunta parece ser hecha por un futuro ingeniero de software y parece que pasó algún tiempo pensando y discutiendo el tema antes de publicar. Voto por ayudarlo en lugar de despedirlo.
DXM
14
@DXM ¡Excelente idea! Flechas hacia abajo / hacia arriba flotando alrededor de los compañeros de trabajo ... Eso funcionaría de maravilla.
Yannis
2
Contraargumento estándar: también hay una forma de ensamblador de hacer todo lo que puede hacer en C, entonces, ¿por qué debería preocuparse por C? (Pista: Se trata de elevar L a nivel de abstracción C ++ se las arregla para hacer esto con sacrificar a cabo la mayor parte de la velocidad de C OMI esa es la principal razón del éxito de C ++...)
SBI

Respuestas:

135

Todas las respuestas hasta ahora se han centrado en el tema de su pregunta como se indicó, que es "cuál es la diferencia entre c y c ++". En realidad, parece que sabes cuál es la diferencia, simplemente no entiendes por qué necesitarías esa diferencia. Entonces, otras respuestas intentaron explicar la OO y la encapsulación.

Quería intervenir con otra respuesta, porque según los detalles de su pregunta, creo que debe retroceder varios pasos.

No comprende el propósito de C ++ u OO, porque para usted, parece que su aplicación simplemente necesita almacenar datos. Estos datos se almacenan en variables. "¿Por qué querría hacer que una variable fuera inaccesible? ¡Ahora ya no puedo acceder a ella! Al hacer que todo sea público, o mejor aún global, puedo leer datos desde cualquier lugar y no hay problemas". - Y tiene razón, según la escala de los proyectos que está escribiendo actualmente, probablemente no haya tantos problemas (o sí los hay, pero aún no se ha dado cuenta de ellos).

Creo que la pregunta fundamental que realmente debe haber respondido es: "¿Por qué querría ocultar datos? ¡Si hago eso, no puedo trabajar con ellos!" Y esta es la razón:

Digamos que comienza un nuevo proyecto, abre su editor de texto y comienza a escribir funciones. Cada vez que necesita almacenar algo (para recordarlo para más adelante), crea una variable. Para simplificar las cosas, hace que sus variables sean globales. Tu primera versión de tu aplicación funciona muy bien. Ahora comienza a agregar más funciones. Tiene más funciones, ciertos datos que almacenó antes deben leerse en su nuevo código. Otras variables necesitan ser modificadas. Sigues escribiendo más funciones. Lo que puede haber notado (o, si no, lo notará en el futuro) es que, a medida que su código se hace más grande, le toma más y más tiempo agregar la siguiente característica. Y a medida que su código se hace más grande, se hace cada vez más difícil agregar funciones sin romper algo que solía funcionar. ¿Por qué? Porque necesitas recordar lo que todosus variables globales son el almacenamiento y hay que recordar donde todos ellos están siendo modificados. Y debe recordar qué función está bien llamar en qué orden exacto y si las llama en un orden diferente , es posible que obtenga errores porque sus variables globales aún no son válidas. ¿Alguna vez te has topado con esto?

¿Qué tan grandes son sus proyectos típicos (líneas de código)? Ahora visualizando un proyecto de 5000 a 50000 veces más grande que el suyo. Además, hay varias personas trabajando en él. ¿Cómo pueden todos los miembros del equipo recordar (o incluso estar al tanto) de lo que están haciendo todas esas variables?

Lo que describí anteriormente es un ejemplo de código perfectamente acoplado. Y desde el comienzo de los tiempos (suponiendo que el tiempo comenzó el 1 de enero de 1970), la humanidad ha estado buscando formas de evitar estos problemas. La forma de evitarlos es dividiendo su código en sistemas, subsistemas y componentes y limitando cuántas funciones tienen acceso a cualquier dato. Si tengo 5 enteros y una cadena que representa algún tipo de estado, ¿sería más fácil para mí trabajar con este estado si solo 5 funciones establecen / obtienen los valores? o si 100 funciones establecen / obtienen estos mismos valores? Incluso sin los lenguajes OO (es decir, C), las personas han estado trabajando arduamente para aislar datos de otros datos y crear límites de separación limpios entre diferentes partes del código. Cuando el proyecto llega a un cierto tamaño, la facilidad de programación se convierte en "no puedo acceder a la variable X desde la función Y",

Es por eso que se han introducido los conceptos de OO y por eso son tan poderosos. Le permiten ocultar sus datos de usted mismo y desea hacerlo a propósito, porque cuanto menos código vea esos datos, menos posibilidades habrá de que, cuando agregue la siguiente función, rompa algo. Este es el propósito principal de los conceptos de encapsulación y programación OO. Le permiten dividir nuestros sistemas / subsistemas en cuadros aún más granulares, hasta un punto en el que, sin importar cuán grande sea el proyecto en general, solo se puede acceder a un conjunto de variables dado por 50-200 líneas de código y ¡eso es todo! Obviamente, hay mucho más en la programación OO, pero, en esencia, esta es la razón por la cual C ++ le ofrece opciones de declarar datos / funciones como privados, protegidos o públicos.

La segunda gran idea en OO es el concepto de capas de abstracción. Aunque los lenguajes de procedimiento también pueden tener abstracciones, en C, un programador debe hacer un esfuerzo consciente para crear tales capas, pero en C ++, cuando declara una clase, crea automáticamente una capa de abstracción (aún depende de usted si esta abstracción agregará o eliminará valor). Debería leer / investigar más sobre las capas de abstracción y, si tiene más preguntas, estoy seguro de que este foro estará encantado de responderlas también.

DXM
fuente
55
Gran respuesta, parece alcanzar el nivel apropiado dada la pregunta
Carlos
29
+1 ... principalmente para la línea "Y desde el principio de los tiempos (asumiendo que el tiempo comenzó el 1 de enero de 1970) ..."
CaffGeek
44
@Chad - Estaba pensando que esa línea por sí sola debería sumarme al menos un punto :)
DXM
Hay una forma de abordar este problema de escala del que habla en el paradigma de procedimiento. Se llama funciones. Pero es una buena forma de explicar el problema.
annoying_squid
@DXM: no estoy seguro de haber entendido la respuesta correctamente. Podemos lograr la misma funcionalidad set / get en la Programación de procedimientos también. Podemos escribir funciones set / get en C para modificar / obtener la variable global. Usando este método también, estamos limitando el número de funciones que están modificando las variables globales. E incluso en OOP, si también usamos los métodos set / get, usaremos estos métodos desde fuera del objeto para cambiar los valores.
kadina
10

Hmm ... tal vez sea mejor hacer una copia de seguridad e intentar dar una idea de la intención básica de la programación orientada a objetos. Gran parte de la intención de la programación orientada a objetos es permitir la creación de tipos de datos abstractos. Para un ejemplo realmente simple con el que indudablemente estás familiarizado, considera una cadena. Una cadena generalmente tendrá un búfer para contener el contenido de la cadena, algunas funciones que pueden operar en la cadena (buscar en ella, acceder a partes de ella, crear subcadenas, etc.) También tendrá (al menos típicamente) algo para haga un seguimiento de la longitud (actual) de la cadena y (probablemente) el tamaño del búfer, por lo que si (por ejemplo) aumenta el tamaño de la cadena de 1 a 1000000, sabrá cuándo necesita más memoria para contener el más grande contenido.

Esas variables (el tampón, la longitud actual y el tamaño del buffer) son privados para la propia cadena, pero son no local a una función particular. Cada cadena tiene contenido de una longitud particular, por lo que necesitamos rastrear ese contenido / longitud para esa cadena. Por el contrario, la misma función (por ejemplo, para extraer una subcadena) podría operar en muchas cadenas diferentes en diferentes momentos, de modo que los datos no pueden ser locales para la función individual.

Como tal, terminamos con algunos datos que son privados para la cadena, por lo que solo es accesible (directamente) para las funciones de cadena. El mundo exterior puede obtener la longitud de la cadena usando una función de cadena, pero no necesita saber nada sobre las partes internas de la cadena para obtenerla. Del mismo modo, podría modificar la cadena, pero de nuevo, lo hace a través de las funciones de cadena, y solo ellas modifican directamente las variables locales del objeto de cadena.

En cuanto a la seguridad, señalaría que si bien esto es razonable como analogía, no es así como funcionan realmente las cosas. En particular, el acceso en C ++ específicamente no está destinado a cumplir el mismo tipo de requisitos que el acceso en un sistema operativo. Se supone que un sistema operativo impone las restricciones para que (por ejemplo) un usuario normal no pueda hacer cosas reservadas para un administrador. Por el contrario, el control de acceso en C ++ solo está destinado a prevenir accidentes. Por diseño, cualquiera que quiera puede evitarlos con bastante facilidad. Están en el mismo orden que marcar un archivo de solo lectura para que no lo elimine accidentalmente. Si decide eliminar el archivo, es trivial cambiarlo de solo lectura a lectura-escritura; configurarlo como solo lectura es hacer que al menos lo pienses un segundo y decidas eliminar el archivo para que no se elimine por accidente solo por presionar la tecla incorrecta en el momento incorrecto.

Jerry Coffin
fuente
6

OOP versus C no se trata realmente de ninguna de las cosas que ha discutido. Se trata principalmente de empaquetar el código en áreas que no se pueden / no pueden afectar involuntariamente (o a veces incluso intencionalmente) entre sí.

C te permite básicamente ejecutar cualquier función desde cualquier lugar. OOP lo impide al agrupar los métodos en clases y solo le permite utilizar los métodos haciendo referencia a la clase que los contiene. Por lo tanto, una gran ventaja potencial de OOP es que es mucho más probable que tenga un mejor arreglo de código sin mucha experiencia que le diga que debería hacerlo.

John Fisher
fuente
44
-1. No hay nada exclusivo en C que haga que todas las funciones sean globales. Puede declarar cualquier función estática y, por lo tanto, limitar su alcance al archivo local. C no es diferente de C ++, Java, etc. en este aspecto. Además, OOP no se trata de la sintaxis del lenguaje, puede escribir programas OO en C muy bien, aunque serán un poco más toscos que en los lenguajes con soporte de sintaxis para OO. Y al contrario: no obtienes OOP solo porque elegiste un idioma que admite OO. La orientación a objetos es un estilo de programación , no una función de lenguaje.
@Lundin: Si bien eres técnicamente correcto, has perdido el punto. Los lenguajes OOP hacen que el comportamiento predeterminado sea comportarse de manera OOP. C no lo hace.
John Fisher
1
No hay nada en los idiomas OO que te obligue a hacer eso. Por ejemplo, he visto innumerables programas oscuros de C ++ sin ningún OO que valga la pena mencionar. Del mismo modo, si no tiene idea de OO pero intenta implementar clases, herencia, etc., existe aproximadamente un 100% de posibilidades de crear un programa desordenado.
@Lundin: No creo que C ++ sea un buen ejemplo. Se pretende (o al menos lo hizo) poder compilar programas en C sin (mucha) modificación. Agregar clases en la parte superior no lo convierte en un lenguaje OOP en el nivel de C # o Java, pero sí permite ese tipo de desarrollo.
John Fisher
También puede escribir programas que no son OO en Java, simplemente piratear en un archivo principal enorme ... OO todavía no es específico del idioma, si el programador no sabe sobre OO, ningún idioma en el mundo los guardará.
4

Una clase bien escrita debería ser una pequeña "isla de confianza": puede usarla y asumir que hace "lo correcto" y que lo protege de las trampas comunes. Eso hace que una buena clase sea un componente básico, que es mucho más reutilizable como un conjunto de funciones y variables, que podrían funcionar bien pero mostrarle todas sus agallas feas y obligarlo a comprender cómo funcionan juntas, cómo deben inicializarse etc. Una buena clase debería ser como un conector USB, mientras que la solución de procedimiento es como un montón de cables, chips, estaño y un poco de soldadura.

Un punto que no se discutió en profundidad es el aspecto de la interfaz / implementación. Una interfaz describe el comportamiento, pero no la realización. Entonces, una interfaz de lista describe el conceptode una lista y su comportamiento: esperaría cosas como agregar, eliminar y dimensionar métodos. Ahora hay muchas formas diferentes de implementar esta lista, por ejemplo, como una lista vinculada o usando un búfer de matriz. El poder de la programación OO es que al usar una interfaz puede razonar sobre el comportamiento sin conocer la implementación. El acceso a variables o métodos internos destruiría esta abstracción, no podría reemplazar una implementación de lista por otra, y no podría mejorar una implementación existente sin tocar el código usando la clase. Esa es una de las razones principales por las que se necesitan variables y métodos privados: para proteger los detalles internos de la implementación, de modo que la abstracción permanezca intacta.

OO va incluso un paso más allá: por ejemplo, para las bibliotecas puede definir una interfaz para cosas que aún no existen , y escribir código que funcione con esa interfaz. Los usuarios pueden escribir clases implementando la interfaz y usar los servicios proporcionados por la biblioteca. Esto permite un grado de flexibilidad que no es posible con la programación de procedimientos.

Landei
fuente
El concepto de interfaces no es exclusivo de los lenguajes orientados a objetos. Creo que un factor más importante es que en los lenguajes que no son OOP, casi todas las funciones utilizadas dentro de un módulo deben pertenecer al mismo espacio de nombres global. Esto requiere que uno prefija los nombres de las funciones para indicar sobre qué actúan, o bien tenga muchos métodos de sonido similar que hacen cosas completamente diferentes (por ejemplo, SetLocationpodrían usarse para mover a Monster, mientras que SetPositionpodrían moverse a PopupWindow, y Movepodrían usarse para ajustar la posición de a DisplayCursor). Tratando de encontrar el método correcto "movimiento" ...
supercat
... puede hacerse mucho más fácil si cuando uno escribe MyMonstor->el editor solo muestra una lista de métodos que son aplicables a las cosas de tipo Monster. Si hay muchas docenas de diferentes tipos de cosas, cada una de las cuales admite alrededor de una docena de operaciones, reducir la cantidad de desorden en las listas de métodos en un 90% puede facilitar enormemente la productividad.
supercat
El choque de nombres de @supercat es un problema de idioma, no un problema que no es OOP. Por otro lado, los espacios de nombres son problemáticos porque el compilador esencialmente necesita cambiar el nombre de la función automáticamente o modificarla. Entonces, ¿por qué no hacerlo manualmente?
annoying_squid
@annoying_squid: lo que ofrece OOP es la capacidad de utilizar eficazmente el tipo de argumento principal de un funciton para seleccionar el espacio de nombres. Si tengo una variable itde tipo SuperFancyWhizBang, invocar uno de SuperFancyWhizBanglos métodos itno requiere escribir el tipo SuperFancyWhizBang; dicho it.woozle()dirigirá al compilador a buscar automáticamente woozledentro SuperFancyWhizBang.
supercat
3

Hay una manera de hacer todo con una máquina de Turing, o como mínimo en un lenguaje ensamblador para el código de máquina que un programa C o C ++ eventualmente compilará.

Entonces, la diferencia no está en lo que el código puede hacer, sino en lo que la gente puede hacer.

La gente comete errores. Un montón.

OOP presenta un paradigma y una sintaxis que ayudan a reducir el tamaño y la densidad de probabilidad del espacio de posibles errores de codificación humana. A veces, al hacer que el error sea ilegal para una determinada clase de objeto de datos (como que no es un método declarado para ese objeto). A veces, al cometer el error más detallado o con un aspecto estilísticamente extraño en comparación con el uso canónico del lenguaje. A veces, al requerir una interfaz con usos mucho menos inconsistentes o enredados (públicos versus privados). etc.

Cuanto más grande es el proyecto, mayor es la probabilidad de errores. A lo que un nuevo codificador podría no estar expuesto si solo tiene experiencia con pequeños programas. Por lo tanto, el potencial desconcierto de por qué OOP es valioso.

hotpaw2
fuente
2

Su pregunta parece más sobre el propósito de OOP en lugar de la diferencia. El concepto en tu publicación es Encapsulación; y la encapsulación existe para apoyar el CAMBIO. Cuando otras clases acceden a sus componentes internos, se hace difícil modificarlos sin romperlos. En OOP, proporciona una interfaz (miembros públicos) a través de la cual permite que otras clases interactúen con la suya, y oculta sus elementos internos para que puedan cambiarse de forma segura.

Eoin Carroll
fuente
Solo usa prototipos de funciones. Eso es encapsulación.
annoying_squid
2

No importa dónde lea, no se puede acceder a las variables privadas, mientras que las variables públicas sí, ¿por qué no hacer que lo público sea tan global y privado como lo local? ¿Cuál es la diferencia? ¿Cuál es el uso real de lo público y lo privado? por favor no diga que puede ser usado por todos, supongo que por qué no usamos algunas condiciones y hacemos las llamadas.

Espero que nunca quieras más de una cadena en tu aplicación. También espero que sus variables locales persistan entre las llamadas a funciones. ¿Estas cosas podrían ser iguales en términos de accesibilidad pero en términos de vida útil y otros usos? No son absolutamente lo mismo.

DeadMG
fuente
1

Como muchos dijeron, cualquier programa, una vez compilado, se convierte en un código binario y, como una cadena binaria podría usarse para representar un número entero, cualquier programa es eventualmente solo un número. Sin embargo, definir el número que necesita podría ser bastante difícil y es por eso que surgieron lenguajes de programación de alto nivel. Los lenguajes de programación son solo modelos del código de ensamblaje que eventualmente producen. Me gustaría explicarle la diferencia entre la programación procedimental y la programación orientada a objetos por medio de este documento muy bueno sobre programación orientada al contexto http://www.jot.fm/issues/issue_2008_03/article4/

Como puede ver en esta imagen, representada en el documento, la programación procesal proporciona solo una dimensión para asociar una unidad computacional con un nombre. Aquí, las llamadas o nombres de procedimientos se asignan directamente a implementaciones de procedimientos. En la Figura-a, la llamada m1 no deja otra opción que la invocación de la única implementación del procedimiento m1.

La programación orientada a objetos agrega otra dimensión para la resolución de nombres a la de la programación de procedimientos. Además del nombre del método o procedimiento, el envío de mensajes tiene en cuenta al receptor del mensaje cuando busca un método. En la Figura-b vemos dos implementaciones del método m1. La selección del método apropiado no solo depende del nombre del mensaje m1, sino también del receptor del mensaje real, aquí Ry.

De hecho, esto permite la encapsulación y la modularización.

ingrese la descripción de la imagen aquí

Finalmente, la figura-c trata sobre la programación orientada a temas que extiende el envío de métodos orientados a objetos por otra dimensión más.

Espero que esto te haya ayudado a pensar en OOP desde una perspectiva diferente.

Silli
fuente
0

(+1) Hacer una pregunta sobre algo que no entiendes, es bueno, incluso si suena tonto.

La diferencia es la programación orientada a objetos y clases. "Plain C", funciona con datos y funciones. "C ++" agrega conceptos de "objeto y clases", además de varios conceptos secundarios relacionados.

Sin embargo, recomiendo a los desarrolladores que aprendan "Plain C" antes de "C ++". O "Pascal de procedimiento" antes de "Pascal de objeto".

Muchos desarrolladores piensan que a los estudiantes se les debe enseñar solo una cosa.

Por ejemplo, los viejos maestros que no obtienen OO y solo enseñan "C estructurado simple".

O maestros "hipster" que enseñan solo OO, pero no "Plain C", porque "no lo necesitas". O ambos, sin importar el orden de enseñanza.

Prefiero pensar que a los estudiantes se les debe enseñar tanto el "C estructurado llano" como el "C orientado a objetos (C ++)". Con "Plain C", primero, y "C ++", más tarde.

En el mundo real, debe aprender ambos paradigmas (además de otros paradigmas, como "funcional").

Pensar que los programas estructurados son un gran "objeto" único puede ayudar.

También debe poner énfasis en los espacios de nombres ("módulos"), en ambos idiomas, muchos maestros simplemente lo ignoran, pero es importante.

umlcat
fuente
Los espacios de nombres y las sobrecargas solo hacen que el programa sea más difícil de entender. Hace que el proceso de identificación sea sensible al contexto. Cuando vea foo()en C ++, puede ser una función global, una función en el espacio de nombres actual, una función en el espacio de nombres que usa using, un método, un método heredado y si está en la llamada a la función: puede estar en un espacio de nombres que se puede resolver mediante la búsqueda de nombres basada en argumentos, y lo mismo es cierto para Java y C #. En C solo puede ser una función estática en el archivo fuente actual, o una desde un encabezado.
Calmarius
Escribir MODULE_Foo () en todas partes puede ser un desorden visual, pero al menos sabes exactamente qué función es.
Calmarius
@Calmarius la solución, claramente, es la de no nombrar nada foo .
0

En una palabra, gestión de proyectos. Lo que quiero decir es que C ++ me ayuda a hacer cumplir las reglas de cómo otros usan mi código. Trabajando en un proyecto de 5.5 millones de líneas, encuentro que la programación orientada a objetos es muy útil. Otra ventaja es el compilador que me hace a mí (y a todos los demás) seguir ciertas reglas y detectar errores menores en tiempo de compilación. Todas las ventajas teóricas también están ahí, pero solo quería centrarme en las cosas prácticas cotidianas. Después de todo, todo se compila en código máquina.

Gus
fuente
-1

La programación orientada a objetos es programación procesal, con cuadros.

En PP, tiene una caja, un estado, que se vuelve increíblemente grande a medida que el proyecto crece, lo que hace que aparezcan efectos secundarios cada vez que olvida un poquito de ese gran estado.

En OO, tiene muchas cajas, muchos estados, y a medida que el proyecto crece, las cajas crecen un poco y la cantidad de cajas crece mucho.

Sigue siendo más fácil mirar cuadros más pequeños, es fácil tener la ilusión de una imagen completa, pero en realidad es casi imposible, ya que mirar clases e interfaces oculta los detalles de implementación que pueden tener ramificaciones importantes.

En la programación funcional, tiene muchos cuadros de funciones y decide que cada función tiene una entrada (parámetros) y una salida (retornos), sin estrictamente ningún otro acceso al contexto externo.

Debido a que no hay estado ni efectos secundarios (por diseño), puede analizar de forma segura cualquier función por separado del conjunto y saber al 100% cómo se comportará en cualquier circunstancia.

Debido a que está encajonando el código por unidades lógicas que representan acciones, también es posible tener solo un recuadro por acción típica.

Esto reducirá el código de cualquier proyecto a gran escala en un factor enorme en comparación con OOP que promueve la ocultación de múltiples funciones analógicas en toda la base de código en diferentes clases.

Esto también superará a PP por mucho, ya que puede hacer crecer el proyecto por mucho más tiempo, ya que no hay más estados XXXXXXXL para seguir.

En resumen, PP es probablemente la forma más sencilla de abordar un programa simple y FP es probablemente la forma más sencilla de abordar un programa complejo.

Si tiene en cuenta el objetivo de unificar todas las bases de código y mejorar la reutilización del código, siempre se debe usar FP, ya que es el único paradigma que tiene sentido a una escala muy grande, así como el único paradigma que tiene un 100% de reutilización (puede simplemente copie y pegue una función y úsela en otro lugar, sin gastos generales).

Y obtienes pruebas unitarias 100% confiables gratis.

Y no tiene que escribir "Private static final of_doom genius awesome string_1".

Y obtienes paralelismo gratis.

Morg
fuente
-3

La diferencia simple de una oración es que C ++ es C con clases. (Aunque ahora es mucho más) No sé por qué no quieres aprender las diferencias entre dos leyendo un excelente artículo sobre C ++ en Wikipedia ... Este artículo le ayudará mucho: - C ++ (Wikipedia)

También buscar en Google sobre el tema ayudará. Pedirle a personas aleatorias que expliquen esto podría ser complicado. En mi humilde opinión, uno entiende mejor leyendo que preguntando a alguien

Pankaj Upadhyay
fuente
Los he leído pero acaban de decir dónde se usan, pero aún no resolvieron mi pregunta.
Nikko
Yo no hago la pregunta sin poner ningún esfuerzo Busqué en Google pero todavía incapaces de comprender la diferencia por lo que me encontré con stackoverflow para ayudarme con estos
Niko
1
@ Niko, me estás entendiendo mal aquí. Lo que quise decir es que debes tratar de entender la diferencia entre los dos leyendo. Preguntar a tus amigos no es bueno. Porque proporcionarán su propia comprensión que podría no satisfacerte. Pero, no te preocupes, hay excelentes compañeros aquí, seguramente te ayudarán :-)
Pankaj Upadhyay
2
No voté en contra, pero tuve la tentación de "C ++ es C con clases". Aquellos de nosotros que puede hacer realmente C ++ dejamos el culo tratando de conseguir que fuera de la cabeza de la gente.
DeadMG
1
@ Pankaj: Eso es correcto. Se era C con Clases. Definitivamente ya no es C con las clases, y llamarlo así está desactualizado hace casi 30 años. C ++ ha recorrido un largo camino desde entonces. Las personas que codifican C ++ ahora nunca, nunca se refieren a eso de esa manera. Fomenta los peores hábitos y la impresión equivocada.
DeadMG