Является ли язык программирования C объектно-ориентированным? - PullRequest
41 голосов
/ 14 июля 2010

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

Что ты думаешь?

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

Ответы [ 12 ]

61 голосов
/ 14 июля 2010

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

19 голосов
/ 14 июля 2010

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

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

10 голосов
/ 14 июля 2010

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

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

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

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

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

9 голосов
/ 14 июля 2010

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

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

3 голосов
/ 15 сентября 2011

C не является языком OO при любом определении «OO» и «языка».

Довольно просто использовать C в качестве языка реализации для компонента, который предоставляет OO API своим клиентам.Система X Windows, по сути, представляет собой ОО-систему с одним наследованием, если смотреть на нее через ее API, но представляет собой целый беспорядок в С при просмотре ее реализации.

3 голосов
/ 14 июля 2010
  1. C не является объектно-ориентированным в строгом смысле, поскольку он не имеет встроенной синтаксической поддержки объектно-ориентированных возможностей, таких как класс, наследование и т. Д.

Но если вы знаете,хитрость, которую вы можете легко добавить к объектно-ориентированной возможности, просто используя struct, указатель на функцию и указатель на себя.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 голосов
/ 14 июля 2010

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

2 голосов
/ 07 сентября 2017

Ответ может быть да или нет , в зависимости от:

  • если вы спросите «Является ли C объектно-ориентированным языком?» , ответ «нет», потому что у него нет объектно-ориентированных конструкторов, ключевых слов, семантики и т. Д ...

  • если вы намереваетесь «могу ли я реализовать ООП в C?» , ответ - да, потому что ООП - это не только требование языка, но и способ «мышления», подход к программированию, прежде чем прикоснуться к тому или иному языку. Однако реализация ООП в C (или любом другом языке, изначально не предназначенном для ООП) будет, безусловно, «принудительной» и намного более сложной для управления, чем любой другой язык ООП, поэтому также следует ожидать некоторых ограничений.

1 голос
/ 20 мая 2017

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

1 голос
/ 14 июля 2010

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

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

...