Конференция "Прочее" » inherited в C++
 
  • Mystic © (18.07.08 13:21) [20]
    > Крайне спорное утверждение.

    Хорошо, давай конкретно перечислять. На основании моих знаний:

    Исключения. Механизм исключений есть в 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).

    Наследование, виртуальные функции. В этом механизме больших изменений не возникло, но опять же кажется, что это было до. Кроме, может быть, абстрактных функций и классов. Эта идея оказалась плодотворной.

    В сумме я вижу не так уж и много...
  • Alkid (18.07.08 14:49) [21]

    > Хорошо, давай конкретно перечислять. На основании моих знаний:

    Что же, наверное в итоге соглашусь с такой постановкой вопроса.


    > Перегрузка операций в C# ближе все-же к Ada.    

    Можно поподробнее об этом? Просто я пока не вижу *существенных* различий между перегрузкой операторов в C++ и в С#.


    > Мне неизвестны другие языки, в которых был предпринят такой
    > подход

    В C# можно value-типы (структуры) на стеке создавать.
    Кстати, возможность делать автоматические объекты пользовательских типов в С++ является (для меня) одной из самых привлекательных возможностей, ибо позволяет применять многие хорошие техники программирования.


    > А сама идея разденения на private/protected/public кажется
    > настолько естественным, что вероятнее всего было до C++
    > (надо смотреть в сторону Modula).

    C++ пропионерил концепцию protected-членов класса.

    В остальном соглашусь.
  • Mystic © (18.07.08 15:43) [22]

    > Можно поподробнее об этом? Просто я пока не вижу *существенных*
    > различий между перегрузкой операторов в 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-членов класса.

    Да, это оказалось достаточно полезно. Но эту концепцию трудно назвать революционной.
  • passing by (18.07.08 16:04) [23]
    >> А в деструкторе NewClass нужно вызывать деструктор предка?
    >> Вызывается автоматически.

    покури на всякий случай виртуальные деструкторы
  • wl © (18.07.08 16:43) [24]

    > passing by   (18.07.08 16:04) [23]

    причем тут?
    что, по твоему выведется на экран в таком коде:

    #include <iostream>
    class a
    {
    public:
    ~a() { std::cout << "~a "; }

    };
    class b: a
    {
    public:
    ~b() { std::cout << "~b "; }

    };
    int main()
    {
    b _b;
    }


  • Alkid (18.07.08 17:00) [25]

    > wl ©   (18.07.08 16:43) [24]

    Будет
    ~b~a

    Гораздо интереснее, что будет, если b от a унаследуется публично, а main() будет иметь вид:

    int main()
    {
     std::auto_ptr<a> b(new b());
    }

  • Alkid © (18.07.08 17:00) [26]

    >  std::auto_ptr<a> b(new b());
    > }

    Идентификатор поинтера - _b, описался :)
  • wl © (18.07.08 17:08) [27]
    ну тут удаление через базовый класс, нужна виртуальность деструктора конечно же. Собственно в этом его и задача насколько я понимаю
  • GrayFace © (18.07.08 20:05) [28]
    rule ©   (18.07.08 10:55) [17]
    Так что я думаю Страуструп очень даже клевый чувак ... может он гей, может он фашист, я не знаю, но то что он не тупой, в этом я точно уверен.

    Вот так и знал, что С++ придумал гей-фашист! :)
  • ketmar © (18.07.08 22:00) [29]
    >[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
  • GrayFace © (19.07.08 00:39) [30]
    ketmar ©   (18.07.08 22:00) [29]
    язык Lua в одном файле на 300 кил сочетает документацию по языку, стандартным библиотекам и C API. этого достаточно, чтобы не только выучить, но и спокойно оный язык использовать. при этом в языке есть средства для создания классов, исключений, перегрузки операторов и ещё куча вкусностей.

    Как я понял, полной справкой по Lua можно считать только книгу "Programming in Lua".
  • ketmar © (19.07.08 13:42) [31]
    >[30] GrayFace © (2008-07-19 00:39:00)
    нет. это как раз набор хитропопых техник. до которых любой может дойти после чтения стандартной документации. всё, что делает PiL — сокращает «время вхождения» для совсем ньюбов.

    лично я учил Lua по мануалу.  и не только я. PiL тогда вообще не было. %-)

    хотя нельзя не признать, что код в книге весьма изящный, и вообще для прочтения использующим Lua всяко рекомендуется. но не обязательно, скорее всего, ничего кроме эстетического удовольствия там не найдётся.

    ---
    Do what thou wilt shall be the whole of the Law.
  • guav © (19.07.08 14:14) [32]
    Так и по С++ не обязательно Страуструпа читать. Вот я не читал, а синтаксис по MSDN освоил, без всяких многократных прочтений. Книги, что я читал по С++, - это всё тоже набор техник, до которых можно и самому дойти.

    > язык Lua в одном файле на 300 кил

    Мне кажется, что ты сравниваешь разные весовые категории. Динамически типизированный скриптоязык, требующий компилятора/интерпретатора на целевой платформе vs портабельный статически типизированный объектно-ориентироавнный ассемблер. Понятно, что второе будет сложнее.
  • ketmar © (19.07.08 15:47) [33]
    >[32] guav © (2008-07-19 14:14:00)
    разница в том, что Lua предоставляет инструменты, а цпп — решения. отсюда цпп уродлив и сложен.

    опять же — сравни цпп и Objective C. я бы не сказал, что Objective C менее выразителен (скорее наоборот), но добились этого намного более изящным методом. потому что сначала думали, а потом делали. страус же — ровно наоборот.

    ---
    All Your Base Are Belong to Us
  • Alkid (19.07.08 17:45) [34]

    > разница в том, что Lua предоставляет инструменты, а цпп
    > — решения. отсюда цпп уродлив и сложен.

    Все языки предоставляют инструменты и ни один - решения.


    > опять же — сравни цпп и Objective C. я бы не сказал, что
    > Objective C менее выразителен (скорее наоборот), но добились
    > этого намного более изящным методом.

    :) Мда. Как будет выглядеть типобезопасный универсальный контейнер на Objective-C? Хотя бы аналог vector`а из STL?


    > потому что сначала думали, а потом делали. страус же — ровно
    > наоборот.

    Сдается мне, что ты именно так письма пишешь. Сначала пишешь, потом думаешь. Это я к чему - на словах опустить можно все что угодно, если не заворачиваться попыткой избрать некую систему объективных критериев и провести честное сравнение. Естественно гораздо проще поступать по принципу -  "мне не нравится => плохое", заменяя предметную аргументацию обидными эпитетами и коверкая имя Страуструпа.

    P.S. Выбор Lua и Objective-C на роль ниспровергателей С++ достаточно неудачен, ибо первый вообще из другой весовой категории, а Objective-C - весьма специфический язык, по сути помесь чистого С (и его недостатков) и Smalltalk. И этот язык даже близко по используемости не добрался до уровня С++.

    P.P.S. А ты часом не линуксоид? :)
 
Конференция "Прочее" » inherited в C++
Есть новые Нет новых   [134439   +46][b:0][p:0.001]