2010-07-13 2 views
30

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

Что вы думаете?

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

+30

Попросите всех согласиться с определением Object Oriented, и тогда я смогу ответить на вопрос. – Yacoby

+2

Объектно-ориентированное программирование (ООП) - это парадигма программирования, которая использует «объекты» - структуры данных, состоящие из полей данных и методов вместе с их взаимодействиями - для разработки приложений и компьютерных программ. Методы программирования могут включать такие функции, как абстракция данных, инкапсуляция, модульность, полиморфизм и наследование. Он не был широко использован в разработке основного программного обеспечения до начала 1990-х. [Править] Многие современные языки программирования теперь поддерживают ООП. –

+5

Это просто одно определение. Должен любить '[править]' btw;) –

ответ

50

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

+17

+1 Единственный способ сказать язык - «вставить парадигму» - это утверждение, если оно облегчает или применяет парадигму с языковыми конструкциями. – pmr

8

C нет объект предназначенный. Это была целая цель позади ++

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

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

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

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

+0

Пожалуйста, объясните ... Я не хочу, чтобы просто нет ответа. –

+0

Если это ["real"] (http://stackoverflow.com/questions/3222316/what-is-a-real-programming-language/3226182#3226182) Языки OO, есть ли поддельные? – 2010-07-13 22:43:31

+2

@Roger Pate: «поддельные» - это те, у которых есть шпон OO, такой как vb.net и php. Они не построены с точки зрения ОО, но предоставляют хотя бы некоторое средство для развития ОО. – NotMe

0

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

+0

Пожалуйста, объясните ... Я не хочу, чтобы просто нет ответа. –

+0

Ну, язык не ориентирован непосредственно на объектно-ориентированное программирование, поэтому для меня это кажется очевидным. –

+3

«Является ли язык программирования C объектно-ориентированным?» "Нет почему?" «Потому что это не так» –

8

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

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

+1

I argee - его можно написать OO-код на любом языке. Недавно я реорганизовал унаследованную программу на C, чтобы разделить модули на пространства имен и объединить все соответствующие коды и переменные. Его удивительно, как это увеличило ремонтопригодность программы - ее нужно было считать верой (по общему мнению, для компилятора C++ для поддержки пространств имен требовался компилятор C++, но я считаю, что пространства имен должны быть частью C в любом случае). – Contango

+0

@Contango: Вы уверены, что это не так? Я не использую C много, но всякий раз, когда я это делаю, я всегда удивляюсь, сколько функций было добавлено за последние 30 лет, что люди относятся так, как будто их не существует. IE, изменяемые по размеру массивы (C09?) И переменные 'const' (C89). – ArtOfWarfare

17

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

Вот несколько примеров:

+5

Я помню коллегу, когда-то читал об OO Perl. Я снял книгу, и моя душа содрогнулась. – johnc

+2

Re: Комментарий к моей функции: я призываю любого программировать OO в BASIC (оригинал, а не этот визуальный материал). –

3

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

1

Если ваш друг не говорил о Objective C (OS superset of C), то нет, C не является языком OO. Вы можете реализовать концепции OO с помощью C (это то, что сделал старый компилятор C++ C++, он перевел C++ на C), но это не делает C OO-язык, поскольку он специально не предлагает поддержку стандартных методов OO, таких как полиморфизм или инкапсуляция.

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

1

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

I имеет Просмотреть объект Ориентировочный кобол. Кобол, который называет Кобола. Вы хотите назвать этих программистов «Реал»?

+3

Я фальшивый программист. Я вообще-то не существую и даже когда думаю, что мог бы существовать, мой код подделка в любом случае. Иногда мне жаль, что я не настоящая. –

+1

[вставить шутки о мнимых числах здесь] – Earlz

3
  1. C не является объектно ориентированным в строгом смысле слова, поскольку он не имеет встроенного синтаксиса, поддерживающего объектно-ориентированную возможность, такую ​​как класс, наследование и т. Д.

Но если вы знаете трюк, вы можете легко добавить к нему объектно-ориентированную возможность, просто используя struct, function pointer, & self-pointer. 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++ не хватает нескольких объектно-ориентированных возможностей, но не помню каждый точно.

2

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

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

+2

Это мнение адекватно выражено существующими ответами. –

0

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

0

Ответ может быть да или нет, в зависимости от того: «это C объектно-ориентированный язык»

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

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

Смежные вопросы