Действительно ли язык программирования C объектно-ориентирован?

Я говорил с коллегой о C и C++, и он утверждал, что C объектно-ориентирован, но я утверждал, что это не было. Я знаю, что можно сделать как будто объектно-ориентированные вещи в C, но C++ является истинным объектно-ориентированным языком.

Каковы Ваши мысли?

Кроме того, это включило обсуждение, кто решает то, что это означает быть объектно-ориентированным и что трудно сказать, что объектно-ориентированный действительно официально означает. Кто Вы мысли об этом?

42
задан Brian T Hannan 13 July 2010 в 22:06
поделиться

9 ответов

Если под "является ли C объектно-ориентированным?" вы подразумеваете "разработан ли C со средствами специально для поддержки объектно-ориентированного программирования?", то нет, C явно не является объектно-ориентированным.

61
ответ дан 26 November 2019 в 23:26
поделиться

Настоящие программисты могут писать объектно-ориентированный код на ЛЮБОМ языке.

Я видел объектно-ориентированного кобола. Кобол, который зовет Кобол. Вы хотите называть этих программистов «Настоящими»?

1
ответ дан 26 November 2019 в 23:26
поделиться

Настоящие программисты могут писать объектно-ориентированный код на ЛЮБОМ языке.

Но нет, C не является «объектно-ориентированным» языком. В нем нет понятия классов, объектов, полиморфизма, наследования.

9
ответ дан 26 November 2019 в 23:26
поделиться
  1. C не является объектно-ориентированным в строгом смысле слова, поскольку он не имеет встроенного синтаксиса, поддерживающего объектно-ориентированные возможности, такие как классы, наследование и так далее.

Но если вы знаете этот трюк, вы можете легко добавить к нему объектно-ориентированные возможности, просто используя структуру, указатель на функцию и указатель на себя. DirectFB - это такая библиотека C, написанная объектно-ориентированным способом. Плохо то, что это больше подвержено ошибкам, поскольку не регулируется синтаксисом и проверкой типов компиляции. Вместо этого он основан на соглашении о кодировании.

например.

  IDirectFB/*a typedef of a struct*/ *dfb = NULL;
  IDirectFBSurface/*another typedef of a struct*/ *primary = NULL;
  DirectFBCreate (&dfb); /*factory method to create a struct (e.g. dfb) with 
                         pointers to function and data. This struct is 
                         like an object/instance of a class in a language with build-in 
                         syntax support for object oriented capability  */
  dfb->SetCooperativeLevel/*function pointer*/ 
          (dfb/*self pointer to the object dfb*/, 
           DFSCL_FULLSCREEN);
  dsc.flags = DSDESC_CAPS;
  dsc.caps  = DSCAPS_PRIMARY | DSCAPS_FLIPPING;
  dfb->CreateSurface/*function pointer, also a factory method 
                       to create another object/instance */
          ( dfb/*self pointer to the object dfb*/, 
            &dsc, 
            &primary/*another struct work as object of another class created*/ );
  primary->GetSize/*function pointer*/ 
              (primary/*self pointer to the object primary*/, 
               &screen_width, 
               &screen_height);

2. C ++ является объектно-ориентированным, поскольку он имеет встроенную поддержку объектно-ориентированных возможностей, таких как классы и наследование. Но есть аргумент, что это не полный или чистый объектно-ориентированный язык, поскольку он допускает в нем синтаксис C (синтаксис структурного программирования). Я также помню, что C ++ не хватает некоторых объектно-ориентированных возможностей, но не помню точно каждую из них.

3
ответ дан 26 November 2019 в 23:26
поделиться

C не является объектно-ориентированным. В этом и заключалась вся цель ++

. Что касается определения того, что нужно для объектно-ориентированной архитектуры: проверьте wikipedia .

Лично, если он поддерживает наследование, инкапсуляцию и полиморфизм, тогда вам хорошо. Еще один ключ здесь - наличие хороших ключевых слов, таких как class и object, как правило, помогают ...

Примеры реальных объектно-ориентированных языков (не окончательные): Smalltalk, Java, C #, Python, Ruby, C ++ ..

Кроме того, возможно наличие расширений для предоставления функций объектно-ориентированного программирования, таких как PHP, Perl, VB (не .Net), ...

10
ответ дан 26 November 2019 в 23:26
поделиться

Путаница может заключаться в том, что C может использоваться для реализации объектно-ориентированных концепций, таких как полиморфизм, инкапсуляция и т.д., что может привести вашего друга к мысли, что C является объектно-ориентированным. Проблема в том, что для того, чтобы считаться объектно-ориентированным языком программирования, эти возможности должны быть встроены в язык. А это не так.

3
ответ дан 26 November 2019 в 23:26
поделиться

Нет, это не так, ваш друг ошибается.

-1
ответ дан 26 November 2019 в 23:26
поделиться

Вы можете программировать в объектно-ориентированном стиле на более или менее любом языке. (Я думаю, что полиморфизм во время выполнения - т.е. виртуальные методы - требует языка, поддерживающего указатели функций.)

Вот пара примеров:

19
ответ дан 26 November 2019 в 23:26
поделиться

Если только ваш друг не говорил об Objective C (OO супермножество C), то нет, C не является OO языком. Вы можете реализовать концепции ОО, используя C (именно это делал старый компилятор cfront C++, он переводил C++ в C), но это не делает C языком ОО, поскольку он не предлагает поддержки стандартных техник ОО, таких как полиморфизм или инкапсуляция.

Да, вы можете писать программы в стиле ОО на языке Си, особенно с либеральным (аб-) использованием макросов, но как человек, который видел результаты некоторых из этих попыток, я бы настоятельно рекомендовал использовать более подходящий язык.

1
ответ дан 26 November 2019 в 23:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: