2010-08-17 3 views
28

Я всегда слышал, что C++ не является объектно-ориентированным, а скорее «C с классами». Итак, когда я сказал интервьюеру, что C++ не был объектно ориентирован, он спросил меня, почему я не рассматривал его как язык OO. Я не делал C++ с Университета, и у меня не было большого количества ответов. Объект C++ ориентирован или нет? и почему?Является ли C++ объектно-ориентированным языком?

+48

Ха-ха, языки ООП просто страдают от эффекта «Нет истинного шотландца» (http://en.wikipedia.org/wiki/No_true_Scotsman). – Jacob

+2

Если вы хотите, чтобы язык на основе C был действительно OO, вы можете пойти с Obj-C. Но мне это не нравится, и вы, вероятно, тоже этого не сделаете. – 2010-08-17 02:00:44

+31

Зачем вам передавать чужое мнение как свое собственное, не задумываясь, чтобы поддержать ваше требование? –

ответ

73

C++ обычно считается языком «multi-paradigm». То есть вы можете использовать его для объектно-ориентированного, процедурного и даже функционального программирования.

Те, кто отрицает, что C++ - это OO, обычно имеют говядину с тем фактом, что примитивные типы не являются самими объектами. По этому стандарту Java также не будет считаться OO.

Это, безусловно, верно, что C++ не является OO в той же степени, что и Smalltalk, Ruby, Self и т. Д., Но это, безусловно, эффективный язык OO по большинству стандартов.

+18

Примитивные типы часто называют объектами по стандарту, и такие удивительные вещи, как 'typedef int INT; 5 .INT :: ~ INT(); 'отлично работает. (Должно быть пробел перед периодом, поэтому он не является десятичным, и вы должны косвенно называть тип 'int' для синтаксиса.) Язык определен как поведение, как будто функции' operator' определены для родных типов, ради того, чтобы посмотреть, что делать с выражением. Синтаксис несколько неоднородный, но меньше, чем «они», если бы вы верили, а функции-члены примитивных объектов все равно переоцениваются. – Potatoswatter

+1

Я уверен, что стандарт не путает типы и объекты. _instance of_ примитивный тип - это объект, но типа нет. Кроме того, самая большая ошибка IMO: вы не можете взять адрес оператора + (int, int) и передать его алгоритмам. – MSalters

2

C++ - ориентированный на объект. C++ - c с классами - это еще один способ сказать, что C++ c с добавлением oop (и, конечно, больше, чем на c).

19

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

Просто игнорируйте их.

+1

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

+4

@hansenj - Можете ли вы добавить вес к своему комментарию, предоставив надежные ссылки на a) определение ООП из тех, которые изобрели термин ООП b) показать, как C++ не соответствует этому определению. – nslntmnx

8

Ключами объектной ориентации являются абстракция, инкапсуляция, полиморфизм и наследование.

Я бы сказал, что C++ демонстрирует все четыре, поэтому он квалифицируется как объектно-ориентированный язык.

Возможно писать C++ как «лучше C» и использовать чисто процедурный стиль. Объекты не являются обязательными. Возможно, это то, о чем вы думаете.

+3

Это просто одно определение OO (и на самом деле объединяет OO с более общими модульными/ADT принципами абстракции и инкапсуляции). Поговорите с людьми в другой форме программирования OO (Smalltalk, кто-нибудь?), И вы обнаружите, что основной отличительной чертой объектной ориентации является передача сообщений между объектами. Трудно определить одно определение OO. –

+0

"conflates"? Я не знаю, что вы имеете в виду. Вы говорите, что участники модульности и инкапсуляции не являются частью объектной ориентации? Я могу передавать сообщения в функциональном стиле. – duffymo

25

C++ является многопрофильным язык программирования paradigm поддержки

стили программирования. Вы можете свободно выбирать (и смешивать), чтобы удовлетворить потребности в вашем проекте.

+0

bot java также поддерживает общее программирование –

+1

@ShubhamPatel Вы не можете сравнить мощность и экспрессивность системы шаблонов C++ с общим синтаксическим сахаром Java. На самом деле C++-система шаблонов является Turing-complete. – ebasconp

5

C++ объектно ориентирован, потому что классы обеспечивают абстракцию и наследование, а также весь этот джаз. Это не всегда считается объектно-ориентированным, потому что код не нужен быть объектно-ориентированным. Это похоже на то, что Scheme не работает, потому что он установил !.

7

C++ - язык OO.
Но это не единственный стиль кодирования, который может использоваться в C++. N Как таковой C++ является технически многостраничным языком, OO которого является лишь одной парадигмой.

Термин «C с классами» имеет пару значений.

  • Это может означать, что C++ - это OO (поскольку классы предоставляют возможности OO).
  • Это может относиться к оригинальной версии «Cfront»
    • который был в основном C с расширением классов и немного еще.
  • Он может относиться (в высшей степени) к стилю программирования, который не использует всю мощь C++, но использует только небольшое подмножество языка.
+0

Первое, что разработал Строуструп, называлось «C с классами», согласно его «Дизайн и эволюция C++» (сама замечательная книга). «C с классами» - это не просто описание начала C++, это имя. –

16

Bah! Люди, которые говорят, что C++ не являются объектно-ориентированными, - это те же самые, которые могли бы сказать, что спам не является продуктом :-)

ОО «религиозный псих» толпа скажет, что вы можете иметь только истинный язык ОО, если он абсолютно все - это объект. Это прекрасно, они могут сидеть в своих башнях из слоновой кости и верить в то, что они хотят. У некоторых из нас есть реальная работа.

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

+0

башни из слоновой кости ?? как python башня из слоновой кости? как рубин башня из слоновой кости? – hasen

+4

@hasen, ни Python, ни Ruby являются по сути башнями из слоновой кости. Люди, которые используют Python или Ruby, настаивая на том, что C++ не могут быть OO, _using_ их как башни из слоновой кости. – paxdiablo

+1

Хорошо, спам - это не просто еда. Это продукт пищевого типа. Это ничего не говорит о C++, хотя ... –

6

Идея состоит в том, что C++ не является только объектно-ориентированным языком.

3

Термин «объектно-ориентированный» слишком туман, чтобы дать определенному да или нет. Я думаю, вы найдете мнение большинства, что C++ - это язык OO, или, по крайней мере, то, что вы можете написать OO-способом в C++. Если вы хотите получить более конкретный ответ, вам нужно задать более определенный вопрос, например:

В: Имеются ли в C++ объекты «объект» (например, поля данных + связанные функции-члены)?
A: Да.

В: Имеются ли в C++ типы объектов, не являющихся объектами?
A: Да.

В: Имеются ли в C++ функции, не являющиеся членами?
A: Да.

1

Это действительно объектно ориентированный, но не строго.

Скажем, например, мы можем иметь только

int main() 
{ 
return 1; 
} 

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

Это зависит от нас, чтобы развить силу языка.

Для интервьюера, который задал вам вопрос показать класс а из C++ и спросить его ли она структурирована или .. действия, при Он покажет вам тот же основной() функция Я думаю :)

Так Я предполагаю, что это основано на том, что вы реализовали. Но у него есть функции, которые могут заставить его считаться ООП.

12

Мех. У каждого есть свое деление ООП.Алан Кей, который изобрел термин ООП сказал: http://www.noulakaz.net/weblog/2007/02/12/true-meaning-of-oop/

OOP мне означает только обмен сообщениями, местное сохранение и защиту и сокрытие государственного процесса, и крайняя позднего связывания всех вещей. Это может быть сделано в Smalltalk и в LISP. Там , возможно, другие системы, в которых это возможно, но я не знаю их.

По этому определению даже Java, C#, Python и т. Д. Не являются языками OO.

ИМХО, эти обсуждения бессмысленны.

2

Если я являюсь интервьюером, задающим вам этот вопрос, я, вероятно, не забочусь о да/нет ответа - я действительно хочу знать, что вы понимаете в программировании, и на языках C++ или на других языках. Вы просто выбрасываете термины, о которых вы не думаете или не понимаете, или вы на самом деле внимательно относитесь к тому, что вы делаете и говорите. Таким образом, в этой ситуации хороший ответ

«Я определяю объектно-ориентированное кодирование как a, b, c и d. Я определяю объект-ориентированный язык как тот, который поддерживает это определение, т. Е. Позволяет мне (легко/равномерно/строго/другое прилагательное) разработать код, который удовлетворяет этим требованиям. C++ поставляет a, b, c и частично на d. Поэтому я не рассматриваю C++ как OO по этим причинам. "

Для моего личного определения C++ достаточно объектно-ориентирован, а также поддерживает другие подходы.

1

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

4

Как говорили другие, C++ не является языком PURE OO. Опять же, единственный чистый язык OO, который я знаю, является небольшим. Единственный чистый функциональный язык, который я знаю, - это исчисление Лямбды. Я не знаю ЛЮБЫХ чистых структурированных языков (все они имеют goto и/или несколько операторов возврата)

Большинство людей не любят писать на чистых языках программирования. Это сужает их стиль.

-3

Объектно-ориентированное программирование (ООП) стало предпочтительным программным подходом в отраслях программного обеспечения, поскольку оно предлагает мощный способ справиться с cpmlexity реальных пролетей. Среди языков ООП, доступных сегодня, C++ является самым широко используемым языком.

Языки должны поддерживать несколько концепций ООП, чтобы утверждать, что они ориентированы на объекты. в зависимости от того, какие они поддерживают, они могут быть разделены на две категории.

  1. Объектно-ориентированные языки программирования.

  2. Объектно-ориентированные языки программирования.

    1. объектно-ориентированный язык программирования. , если он поддерживает

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

      2.Объектно-ориентированные языки программирования.

      Он поддерживает все объектно-программирования на основе функции, наряду с двумя дополнительными функциями

      E. INHERITANCE 
          F. DYNAMIC BINDING 
      

, следовательно, объектно-ориентированных языков программирования означает

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

Примеры: C++, SMALLTALK, OBJECT PASCAL, JAVA

Так, C++ является объектно-ориентированным программированием ЯЗЫКА>

Если вы все равно должны иметь какое-то сомнение в объектно-ориентированных концепциях программирования приведена в книге E.Balaguruswamy.

1

C++ частично OO, потому что код может быть написан без класса, и он также имеет множественную концепцию наследования, то есть один ребенок может иметь более одного родителя.

2

Stroustrup, который проектировал C с классами, а именно: оригинальная реализация стандарта ISO C++, ответила на тот же вопрос в OOPSLA '95 ACM. Бумажная копия доступна по адресу http://www.stroustrup.com/oopsla.pdf.

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