2010-08-17 16 views
28

Siempre escuché que C++ no está orientado a objetos, sino más bien "C con clases". Entonces, cuando mencioné a un entrevistador que C++ no estaba realmente orientado a objetos, me preguntó por qué no lo consideraba un lenguaje OO. No he hecho ningún C++ desde la Universidad, y no tenía mucha respuesta. ¿C++ está orientado a objetos o no? ¿y por qué?¿C++ es un lenguaje orientado a objetos?

+48

Jaja, los lenguajes OOP solo sufren el efecto No True Scotsman (http://en.wikipedia.org/wiki/No_true_Scotsman). – Jacob

+2

Si quieres un lenguaje basado en C que sea realmente OO, entonces podrías elegir Obj-C. Pero, no me gusta y probablemente tampoco. –

+31

¿Por qué transmitirías la opinión de otra persona como la tuya sin pensar en ella para respaldar tu reclamo? –

Respuesta

73

C++ generalmente se considera un lenguaje "multi-paradigma". Es decir, puede usarlo para programación orientada a objetos, de procedimiento e incluso funcional.

Los que negarían que C++ es OO en general tienen problemas con el hecho de que los tipos primitivos no son objetos en sí mismos. Según este estándar, Java tampoco se consideraría OO.

Es cierto que C++ no es OO en la misma medida que Smalltalk, Ruby, Self, etc., pero definitivamente es un lenguaje OO eficaz según la mayoría de los estándares.

+18

Los tipos primitivos a menudo son llamados objetos por el estándar, y cosas sorprendentes como 'typedef int INT; 5 .INT :: ~ INT(); 'funcionan bien. (Debe haber un espacio antes del período para que no sea un decimal, y debe nombrar indirectamente el tipo 'int' para sake de sintaxis.) El lenguaje está definido para comportarse como si las funciones' operator' se definieran para los tipos nativos, por el bien de buscar qué hacer con una expresión. La sintaxis es un tanto no uniforme, pero menos de lo que "ellos" te harían creer, y las funciones miembro de los objetos primitivos están sobrevaloradas de todos modos. – Potatoswatter

+1

Estoy bastante seguro de que el estándar no confunde tipos y objetos. Una _instancia de_ un tipo primitivo es un objeto, pero el tipo no. Además, el mayor error de la OMI: no se puede tomar la dirección del operador + (int, int) y pasarlo a los algoritmos. – MSalters

2

C++ está orientado a objetos. C++ es c con clases es otra forma de decir que C++ es c con oop agregado (y por supuesto, hay más que eso encima de c).

19

C++ es un lenguaje orientado a objetos. El problema es que algunos fanáticos del lenguaje tienen su propia definición, a veces contradictoria de OOP. Por ejemplo, algunas personas de Java dicen que C++ no es un lenguaje OOP porque puede definir funciones fuera de una clase.

Simplemente ignórelos.

+1

No son necesariamente los "fanáticos", los tipos que inventaron el término OOP tenían una definición (quizás nunca se formalizó), y C++ no se ajusta a esa definición. Desde entonces, muchas personas se han subido al carro de OOP y ahora parece que todas las formas y definiciones de OOP son igualmente "válidas" porque la mayoría de las personas no conocen la definición original. – hasen

+4

@hansenj - ¿Puede agregar peso a su comentario al proporcionar referencias creíbles a a) definición de OOP de aquellos que inventaron el término OOP b) mostrar cómo C++ no cumple con esa definición. – nslntmnx

8

Las características distintivas de la orientación a objetos son la abstracción, el encapsulado, el polimorfismo y la herencia.

Yo diría que C++ exhibe los cuatro, por lo que califica como un lenguaje orientado a objetos.

Es posible escribir C++ como "una C mejor" y usar un estilo puramente de procedimiento. Los objetos no son obligatorios. Tal vez eso es lo que estás pensando.

+3

Esa es solo una definición de OO (y realmente combina OO con principios de abstracción y encapsulación modulares/ADT más generales). Habla con personas de otra índole de la programación OO (Smalltalk, ¿alguien?) Y verás que el sello central de la orientación a objetos es pasar mensajes entre objetos. Es difícil precisar una definición de OO. –

+0

"conflacta"? No sé a qué te refieres. ¿Estás diciendo que los principios de modularidad y encapsulación no son parte de la orientación a objetos? Puedo pasar mensajes en un estilo funcional, también. – duffymo

25

C++ es un lenguaje de programación multi-paradigm apoyo

estilos de programación (clasista)

  • generic (template metaprogramming). Puede elegir (y mezclar) libremente para satisfacer las necesidades de su proyecto.

  • +0

    bot java también es compatible con la programación genérica –

    +1

    @ShubhamPatel No se puede comparar el poder y la expresividad del sistema de plantillas C++ con el azúcar sintáctico genérico de Java. En realidad, el sistema de plantillas C++ es Turing-completo. – ebasconp

    5

    C++ está orientado a objetos, porque las clases proporcionan abstracción y herencia y todo ese jazz. No siempre se considera orientado a objetos porque el código no necesita para estar orientado a objetos. Es como decir que Scheme no es funcional porque se ha establecido.

    7

    C++ es un lenguaje OO.
    Pero ese no es el único estilo de codificación en el que se puede usar C++. N Como tal, C++ es técnicamente un lenguaje multiparadigma del cual OO es solo un paradigma.

    El término "C con clases" tiene un par de significados.

    • Puede referirse al hecho de que C++ es OO (ya que las clases le dan las capacidades de OO).
    • Puede referirse a la versión original de "cfront"
      • que era básicamente C con la extensión de las clases y poco más.
    • Puede referirse (de forma despectiva) a un estilo de programación que no utiliza toda la potencia de C++ pero que solo utiliza un pequeño subconjunto del idioma.
    +0

    Lo primero que desarrolló Stroustrup se llamó "C con clases", de acuerdo con su "Diseño y evolución de C++" (un maravilloso libro en sí mismo). "C con clases" no es solo una descripción de los comienzos de C++, es un nombre. –

    16

    Bah! Las personas que dicen que C++ no está orientado a objetos son los mismos que dirían que Spam no es comida :-)

    La multitud de "fanáticos religiosos" de OO dirá que solo se puede tener un verdadero lenguaje OO si absolutamente todo es un objeto. Está bien, pueden sentarse en sus torres de marfil y creer lo que quieran. Algunos de nosotros tenemos trabajos reales para hacer.

    Siempre que utilice la mentalidad de objeto, C++ (e incluso C si utiliza todo tipo de trucos con punteros de función dentro de las estructuras) es más que suficiente para ser considerado orientado a objetos.

    +0

    marfil torres ?? ¿cómo es Python una torre de marfil? ¿Cómo está Ruby una torre de marfil? – hasen

    +4

    @hasen, ni Python ni Ruby son intrínsecamente torres de marfil. Las personas que usan Python o Ruby e insisten en que C++ no puede ser OO, las están usando como torres de marfil. – paxdiablo

    +1

    Ok, el spam no es CLARAMENTE un alimento. Es un producto de tipo alimenticio. Sin embargo, esto no dice nada sobre C++ ... –

    6

    La idea es que C++ no es solo un lenguaje orientado a objetos.

    3

    El término "orientado a objetos" es demasiado nebuloso para dar una respuesta afirmativa o negativa . Creo que encontrará que la opinión de la mayoría es que C++ es un idioma OO, o al menos que puede escribir de manera OO en C++. Si desea una respuesta más definida, deberá formular una pregunta mejor definida, como por ejemplo:

    P: ¿C++ tiene tipos de datos "objeto" (es decir, campos de datos + funciones miembro asociadas)?
    A: Sí.

    P: ¿C++ tiene tipos de datos no objeto?
    A: Sí.

    P: ¿Tiene C++ funciones no miembro?
    A: Sí.

    1

    De hecho, está orientado a objetos, aunque no estrictamente.

    decir, por ejemplo, podemos tener sólo

    int main() 
    { 
    return 1; 
    } 
    

    que es nada en nombre de orientado a objetos y, por otro lado podemos tener clases, herencia, polimorfismo, etc., que corresponde orientado a objetos

    Depende de nosotros liberar el poder del idioma.

    Para el entrevistador que le hizo la pregunta mostrar una clase a de C++ y preguntarle si está estructurado o procedured .. Se le mostrará la misma función main() supongo :)

    Así

    Supongo que se basa en lo que has implementado que miente. Pero tiene características que pueden hacer que se considere como un OOP.

    12

    Meh. Todos tienen su propia definición de OOP.Alan Kay quien inventó el término POO dijo: http://www.noulakaz.net/weblog/2007/02/12/true-meaning-of-oop/

    programación orientada a objetos para mí significa que sólo la mensajería, retención local y la protección y ocultamiento de el estado del proceso, y la extrema enlace tardío de todas las cosas. Puede ser hecho en Smalltalk y en LISP. Hay posiblemente otros sistemas en los que esto es posible, pero no estoy al tanto de ellos.

    En esa definición, incluso Java, C#, Python, etc. no son lenguajes OO.

    En mi humilde opinión, estas discusiones son inútiles.

    2

    Si soy un entrevistador que le hace esta pregunta, probablemente no me preocupe la respuesta sí/no. Realmente quiero saber qué entiende sobre programación y C++ u otros idiomas. ¿Acabas de tirar términos que no piensas o entiendes, o realmente consideras cuidadosamente lo que estás haciendo y diciendo? Entonces, en esta situación, una buena respuesta es

    "Defino la codificación orientada a objetos como a, b, c y d. Defino un lenguaje orientado a objetos como uno que admite esa definición, es decir, me permite (fácilmente/uniformemente/rigurosamente/otro adjetivo) desarrollar código que cumpla con esos requisitos. C++ ofrece a, b, c, y parcialmente en d. Así que lo hago (no lo hago) considero que C++ es OO por esos motivos ".

    Para mi definición personal, C++ está orientado a objetos lo suficiente, además de que admite otros enfoques.

    1

    C++ no es un lenguaje orientado a objetos. El lenguaje no es ningún paradigma. Esto está en contra de Java, que está religiosamente orientado a objetos (sin declaración de amigo, por ejemplo). C++ ofrece orientación a objetos, pero no está inherentemente orientado a objetos.

    4

    Como otros han dicho, C++ no es un lenguaje PURE OO. Por otra parte, el único lenguaje Pure OO que conozco es smalltalk. El único lenguaje funcional puro que conozco es el Cálculo Lambda. No conozco CUALQUIER lenguaje estructurado puro (todos tienen declaraciones de retorno goto y/o múltiples)

    A la mayoría de las personas no les gusta escribir en lenguajes de programación puros. Ciega su estilo.

    -3

    La programación orientada a objetos (OOP) se ha convertido en el enfoque de programación preferido por las industrias de software, ya que ofrece una forma poderosa de lidiar con la complejidad de los problemas del mundo real. Entre los lenguajes de OOP disponibles en la actualidad, C++ es lejos el idioma más utilizado.

    Los lenguajes deben admitir varios de los conceptos de OOP para afirmar que están orientados a objetos. dependiendo de las fetures que admiten, se pueden clasificar en dos categorías.

    1. Lenguajes de programación basados ​​en objetos.

    2. Lenguajes de programación orientados a objetos.

      1. lenguajes de programación basado en objetos. si es compatible con

        A. DATA ENCAPSULATION 
            B. DATA HIDING AND ACCESS MECHANISAMS 
            C. AUTOMATIC INITIALIZATION& CLEAR-UP OF OBJECTS 
            D. OPERATOR OVER LOADING 
        

        2.Lenguajes de programación orientados a objetos.

        Es compatible con toda la programación basada en objetos características, junto con dos características adicionales

        E. INHERITANCE 
            F. DYNAMIC BINDING 
        

    lenguajes de programación, por lo tanto orientados a objetos significa

    **Object-based features+ inheritance+ dynamic binding.** 
    

    Ejemplos: C++, SMALLTALK, OBJECT PASCAL, JAVA

    Así, C++ es un lenguaje de programación orientada a objetos>

    Si todavía debe tener algunas dudas en los conceptos de programación orientada a objetos, consulte el libro de E.Balaguruswamy.

    1

    C++ es parcialmente OO porque el código se puede escribir sin la clase y también tiene un concepto de herencia múltiple, es decir, un niño puede tener más de un padre.

    2

    Stroustrup, quien diseñó C con clases, a saber. la implementación original del estándar ISO C++, respondió la misma pregunta en el OOPSLA '95 de ACM. La copia en papel del papel está disponible en http://www.stroustrup.com/oopsla.pdf.

    Cuestiones relacionadas