-
> Крайне спорное утверждение.
Хорошо, давай конкретно перечислять. На основании моих знаний:
Исключения. Механизм исключений есть в Ada. В C++ механизм исключений дополнился возможностью передавать не только тип исключения, но и конкретный объект. Согласен, это была продуктивная идея.
Перегрузка операторов. Приоритета C++ в этом нету, перегрузка операторов была еще в Algol. Prolog предоставляет более гибкие механизмы перегрузки: для каждого оператора задается лексема, инфиксность и приоритет. Перегрузка функций в C++ имеет ту характерную особенность, что она привязана к наиболее эффективному способу генерации кода для целевой машины. Эта идея не получила дальнейшего своего распространения. Перегрузка операций в C# ближе все-же к Ada.
Реализация объектов. C++ один из немногих языков (других я не знаю), где объекты могут создаваться как в стеке, так и в куче. Конечно, стандарт не уделяет внимания вопросам реализации, но описано это так, что наиболее простой и понятный способ реализации есть помещение объектов в стек. Сделано опять же из-за соображений производительности. Мне неизвестны другие языки, в которых был предпринят такой подход (кроме может быть object в паскаль).
Система приведений типов объектов. В C++ она очень богатая, но большого развития не получила. Сюда же можно добавить static_cast, reinterpret_cast, ... которые также есть только в C++.
Множественное наследование. Встречается только в скриптовых языках, да и там оно совсем-совсем другое.
Шаблоны. Частично взяты с Ada, так что концепция не нова. Предоставляют новые возможности метапрограммирования, которое также не получило распространения в наследниках. Подобная возможность (и только она) изначально присутсвует в функциональных языках, поэтому говорить о том, что ФЯ взяли ее с С++, имхо, некорректно.
Константность. Та часть, что используется только для параметров функций, давно была в Ada (in, out, access). А вот константные объекты, mutable и прочее, константные методы я особо в других языках не замечал.
Модификаторы области видимости. Опять же в точности такой же системы, как в C++, я не встречал. public, private, protected остались. private наследование не знаю. В C++ модификатор доступа может быть только усилен (public => protected => private). Опять же private наследование... Все это специфично для C++. А сама идея разденения на private/protected/public кажется настолько естественным, что вероятнее всего было до C++ (надо смотреть в сторону Modula).
Наследование, виртуальные функции. В этом механизме больших изменений не возникло, но опять же кажется, что это было до. Кроме, может быть, абстрактных функций и классов. Эта идея оказалась плодотворной.
В сумме я вижу не так уж и много...
-
> Хорошо, давай конкретно перечислять. На основании моих знаний:
Что же, наверное в итоге соглашусь с такой постановкой вопроса.
> Перегрузка операций в C# ближе все-же к Ada.
Можно поподробнее об этом? Просто я пока не вижу *существенных* различий между перегрузкой операторов в C++ и в С#.
> Мне неизвестны другие языки, в которых был предпринят такой > подход
В C# можно value-типы (структуры) на стеке создавать. Кстати, возможность делать автоматические объекты пользовательских типов в С++ является (для меня) одной из самых привлекательных возможностей, ибо позволяет применять многие хорошие техники программирования.
> А сама идея разденения на private/protected/public кажется > настолько естественным, что вероятнее всего было до C++ > (надо смотреть в сторону Modula).
C++ пропионерил концепцию protected-членов класса.
В остальном соглашусь.
-
> Можно поподробнее об этом? Просто я пока не вижу *существенных* > различий между перегрузкой операторов в C++ и в С#.
Вот страничка описания стандарта Ada'83 http://archive.adaic.com/standards/83lrm/html/lrm-06-07.htmlПо стандарту Ады переименовывать нельзя присваивание, точку, возможно другие операторы, которые имеют специальное назначение. C++ пошел в этом пути дальше, там переименовывать можно если не все, то многое, что иногда дает весьма забавные эффекты. С# же в этом вопросе откатился на позиции Ada: нельзя перегружать =, ., ?:, ->, new, is, sizeof, typeof. Зачастую стандарт C++ описывает подробно смысл, в котором перегружается оператор. Более того, соглашения по поводу перегрузки операций ++ и -- в языке C# в общем случае менее эффективны, чем те, которые в C++. Но более человечны, что-ли... Скажем, уже без разницы, как писать цикл: for(SomeTime i = startValue; i < lastValue; ++i) или for(SomeTime i = startValue; i < lastValue; i++) А вот знакомство с особенностями C++ приучило меня к первому варианту. > В C# можно value-типы (структуры) на стеке создавать. > Кстати, возможность делать автоматические объекты пользовательских > типов в С++ является (для меня) одной из самых привлекательных > возможностей, ибо позволяет применять многие хорошие техники > программирования.
value типы можно и в куче хранить (boxing-unboxing), но все-же как для меня это совсем немного другая концепция. Конечно, в том что реализовано в C++ есть свои привлекательные черты. Например, создавая переменные в стеке мы не мусорим, поэтоому нет острой потребности в сборке мусора. Если добавить weak pointers, то проектировать системы, в которых сборка мусора не требовалась бы, становится не так уж проблемно. Но мы разговариваем о том, что другие языки подхватили. > C++ пропионерил концепцию protected-членов класса.Да, это оказалось достаточно полезно. Но эту концепцию трудно назвать революционной.
-
>> А в деструкторе NewClass нужно вызывать деструктор предка? >> Вызывается автоматически.
покури на всякий случай виртуальные деструкторы
-
> passing by (18.07.08 16:04) [23]
причем тут? что, по твоему выведется на экран в таком коде:
#include <iostream>
class a
};
class b: a
};
int main()
-
> wl © (18.07.08 16:43) [24]
Будет ~b~a Гораздо интереснее, что будет, если b от a унаследуется публично, а main() будет иметь вид: int main()
-
> std::auto_ptr<a> b(new b()); > }
Идентификатор поинтера - _b, описался :)
-
ну тут удаление через базовый класс, нужна виртуальность деструктора конечно же. Собственно в этом его и задача насколько я понимаю
-
rule © (18.07.08 10:55) [17] Так что я думаю Страуструп очень даже клевый чувак ... может он гей, может он фашист, я не знаю, но то что он не тупой, в этом я точно уверен. Вот так и знал, что С++ придумал гей-фашист! :)
-
>[15] Игорь Шевченко © (2008-07-17 23:43:00) >Чтоб тебе быть хоть на тысячную долю таким тупым, как Страуструп… тогда меня запрут в палату с мягкими стенами.
>[16] Alkid (2008-07-18 10:11:00) >У тебя какие-то комплексы по отношению к Страуструпу? мне-то что, я не вынужден пользоваться его бредом.
>[17] rule © (2008-07-18 10:55:00) >И наследники (Джава там, ПХП, Рубби …) они все то взяли очень многие идеи именно >от С++ бугога. жги ещё.
>И книга у него написана очень даже доступно и разжевано. То что там очень много >информации, и тяжелой для восприятия за один раз. язык Lua в одном файле на 300 кил сочетает документацию по языку, стандартным библиотекам и C API. этого достаточно, чтобы не только выучить, но и спокойно оный язык использовать. при этом в языке есть средства для создания классов, исключений, перегрузки операторов и ещё куча вкусностей.
язык Objective C отличается от C фактически одной добавленой конструкцией. для её понимания достаточно пары страниц текста и нескольких примеров.
так что «много тяжелой для восприятия информации» означает лишь, что описывают тяжёлую и неповоротливую дуру. что и не удивительно, если учесть, что у цпп не было даже дизайн-документа.
--- All Your Base Are Belong to Us
-
ketmar © (18.07.08 22:00) [29] язык Lua в одном файле на 300 кил сочетает документацию по языку, стандартным библиотекам и C API. этого достаточно, чтобы не только выучить, но и спокойно оный язык использовать. при этом в языке есть средства для создания классов, исключений, перегрузки операторов и ещё куча вкусностей. Как я понял, полной справкой по Lua можно считать только книгу "Programming in Lua".
-
>[30] GrayFace © (2008-07-19 00:39:00) нет. это как раз набор хитропопых техник. до которых любой может дойти после чтения стандартной документации. всё, что делает PiL — сокращает «время вхождения» для совсем ньюбов.
лично я учил Lua по мануалу. и не только я. PiL тогда вообще не было. %-)
хотя нельзя не признать, что код в книге весьма изящный, и вообще для прочтения использующим Lua всяко рекомендуется. но не обязательно, скорее всего, ничего кроме эстетического удовольствия там не найдётся.
--- Do what thou wilt shall be the whole of the Law.
-
Так и по С++ не обязательно Страуструпа читать. Вот я не читал, а синтаксис по MSDN освоил, без всяких многократных прочтений. Книги, что я читал по С++, - это всё тоже набор техник, до которых можно и самому дойти.
> язык Lua в одном файле на 300 кил
Мне кажется, что ты сравниваешь разные весовые категории. Динамически типизированный скриптоязык, требующий компилятора/интерпретатора на целевой платформе vs портабельный статически типизированный объектно-ориентироавнный ассемблер. Понятно, что второе будет сложнее.
-
>[32] guav © (2008-07-19 14:14:00) разница в том, что Lua предоставляет инструменты, а цпп — решения. отсюда цпп уродлив и сложен.
опять же — сравни цпп и Objective C. я бы не сказал, что Objective C менее выразителен (скорее наоборот), но добились этого намного более изящным методом. потому что сначала думали, а потом делали. страус же — ровно наоборот.
--- All Your Base Are Belong to Us
-
> разница в том, что Lua предоставляет инструменты, а цпп > — решения. отсюда цпп уродлив и сложен.
Все языки предоставляют инструменты и ни один - решения.
> опять же — сравни цпп и Objective C. я бы не сказал, что > Objective C менее выразителен (скорее наоборот), но добились > этого намного более изящным методом.
:) Мда. Как будет выглядеть типобезопасный универсальный контейнер на Objective-C? Хотя бы аналог vector`а из STL?
> потому что сначала думали, а потом делали. страус же — ровно > наоборот.
Сдается мне, что ты именно так письма пишешь. Сначала пишешь, потом думаешь. Это я к чему - на словах опустить можно все что угодно, если не заворачиваться попыткой избрать некую систему объективных критериев и провести честное сравнение. Естественно гораздо проще поступать по принципу - "мне не нравится => плохое", заменяя предметную аргументацию обидными эпитетами и коверкая имя Страуструпа.
P.S. Выбор Lua и Objective-C на роль ниспровергателей С++ достаточно неудачен, ибо первый вообще из другой весовой категории, а Objective-C - весьма специфический язык, по сути помесь чистого С (и его недостатков) и Smalltalk. И этот язык даже близко по используемости не добрался до уровня С++.
P.P.S. А ты часом не линуксоид? :)
|