Чтобы успешно писать на плюсиках надо точно и совершенно безотказно помнить некоторые их приколы, которые к тому же не собраны в какую-либо лаконичную С+±приколологию, и вместе онлайн компилятор си шарп с тем очень больно бьют по голове, если о них забываешь. Особенно это сказывается во всяких шаблончиках-макросах-многопоточке. Как следствие — невозможность отлучиться от проекта безболезненно, править код на отморозе, и жуткая инертность с апгрейдами — это же новое учить и запоминать. Я не знаю что там добавили в C++20, а начиная с C++11 для этих целей служит механизм SFINAE. Который позволяет реализовать ограничения и/или выбор подходящего шаблона в зависимости от типа-параметра.
А как с компиляцией в других языках
- Это проектная ошибка, которая до сих пор заставляет спотыкаться новичков, казалось бы, на ровном месте.
- В противном случае логические ошибки в отладке искать куда сложнее и дольше.
- Ты рассказываешь, что с мувом («нью-мув-делит») — всё будет работатъ гораздо быстрее, т.к.
- Этот онлайн компилятор C# поддерживает еще F# и VB.NET.
- Язык программирования C# (произносится си-шарп) – это простой и многофункциональный язык.
Компиляторы в таких случаях обычно ориентируются на оптимальность выполнения сгенерированного кода. И это может легко приводить к поведению, которое из кода не очевидно, и логическим ошибкам. Шаблонный класс — это болванка класса, в которую будет подставлен конкретный тип/типы в момент создания объекта этого класса.
Запускай код прямо в браузере: лучшие онлайн-компиляторы для C++, PHP, Python, Java, C#, Go и не только
Более того, известный автор Скотт Мейерс пишет, что на некоторых платформах чтение неинициализированной переменной приводит к аварийной остановке программы. На мой взгляд, такой способ перегрузки функций очень странный. Получается, без дополнительной языковой конструкции он противоречит одному из базовых принципов ООП, что класс-наследник расширяет возможности базового класса. Не видел такого поведения ни в одном из знакомых мне языков.
Недружелюбность C++ к новичкам: взгляд Unity-разработчика
А перемещаемые, если они уже были перемещены в новое место, больше к этому моменту не содержат никаких динамических данных (их «украли», а указатели в источниках занулили) — и поэтому деструкторы для них ничего не сделают. Копируемые элементы необходимо грохать, раз они стали ненужны. Потому что копирование в объекте-источнике ничего грохнуть не могло — для операции копирования он был const. Они грохнут память, на которую ссылаются копируемые/перемещаемые элементы. Дефолтные (автогенерированные) конструкторы кoпирования — тоже «дип-копи» не делают. Не данные не только присваиваются (т.е. копируются), но ещё и источник обнуляется.
Здесь первое время могут помочь только гугл и более опытный коллега. Но со временем и к этим ошибкам привыкаешь. К сожалению, никто не подскажет, если после вызова конструктора у вас все же останутся неинициализированные поля.
Чтобы потом не удивляться, почему программа с векторами или прочими стрингами работает жутко тормознуто как будто это Джава. Гляньте еще на Haxe, я его использую для нативной разработки под телефоны, например. Он транслируется в С++, Java и другие языки. Под андроид можно собрать как в виде Java, так и нативно аки С++.
«плюсовой» стандарт накладывает дополнительные требования непрерывности памяти под STL-ным «вектором» (хотя, вроде, не все реализации STL ему следуют). Те, которые я читал (Саттер-Александреску, Майерс), как раз нормально всё объясняли. Современные плюсы (с нормальной современной реализацией STL) генерируют такой же код как и C. Можно, но мультиплатформенность там на очень ранней стадии. Исходники на Kotlin можно использовать напрямую из Java на Android, а для iOS они могут компилироваться во Framework (github.com/…master/samples/calculator) и использоваться из Swift/ObjC.
Когда класс маленький, то кажется, что так удобнее. Но когда методов и переменных так много, что они занимают как минимум несколько страниц, то без строгих правил в именовании уже не получится, глянув на заголовок метода, сказать, какой у него модификатор. При смене модификатора доступа на другой придется делать лишние движения — искать границы соответствующего блока, подходящее место для вставки, переименовывать метод. Требование явно указывать модификатор доступа повысило бы читаемость кода и как минимум помогло бы новичкам. Оставим обсуждение, на сколько это канонично, теоретикам, а на сколько практично — гуру. Лично мне не нравится, что указание типа наследования не сделали обязательным и в то же время по умолчанию разным для struct и class — public и private соответственно.
Так что к плюсовым темплейтным абстракциям данная проблема имеет очень косвенное отношение. Короче, хочу статическую фиксированную capacity, но не size.Но при этом так, чтоб работало оно так же быстро, как с простым массивом.Мне кажется, что с оптимизирующим компилятором это должно быть возможно. Перспективность языка определяется не красотой циклов, а практической возможностью его применения. ИМХО у Swift почти нет шансов выйти за пределы Apple-платформ, а Apple-платформы сами по себе меня не интересуют вообще. Туда ничего в принципе нельзя запихнуть по значению, кроме самых примитивных типов. И деструкторы при резервировании не вызываются.
Если присваивать значения полям в конструкторе класса считается нормальной практикой — вы меня успокоили. О сложных правилах инициализации пишет Мейерс, я ему верю. Сам же всегда инициализирую переменные явно, шарп научил, но в геймдеве на проектах всегда много коллег и не все одинаково аккуратны. Новичкам же, которые пришли с других языков, полезно знать такую особенность сразу. А в остальном, все это напоминает причитания на тему «как сложно жить».
То, как Вы расписали «проблемы» языка С++ может свидетельствовать о том, что Вы и в других языках не очень разбираетесь. Просто в других языках Вам не приходится глубоко копать для достижения приемлемого результата, поэтому Вас все устраивает. В нашем деле главное — результат, а не круче всех разбираться в языке. Если Ваш уровень устраивает Ваших работодателей — то и славно, результат достигнут. А вот замахиваться на анализ «проблем» языков все же не стОит. Я говорил о добавлении в производные классы новых методов с такими же названиями, как существующие методы в базовых классах.
Я так сходу не вспомню какой-то прям всеобъемлющей ссылки. Если это одиночный пет-проект — выкручиваем ворнинги и code analysis компилятора на максимум, подключаем clang-tidy, гоняем тесты под санитайзерами, соблюдаем cppcoreguidelines. Можно еще обмазаться каким-то pvs-studio, если совсем скучно на карантине. Для мелких/средних проектов должно хватить. Такой вывод я сделал снова же на основании книги Мейерса за 2006й год. Вполне вероятно, что сейчас это стало неактуальным.
Старая область памяти (под старым указателем) будет прибита — т.к. Она стала мала и нужна новая бОльшая область (под новым указателем). Пример с добавлением в производный класс функции с таким же именем, как виртуальная функция в базовом, заставляет задумываться, всё ли у вас в порядке с архитектурой. Даже если б оно работало без необходимости писать using, это выглядит как расстановка граблей для других программистов (или для себя же в будущем). А если уж хочешь иметь доступными обе — будь добр, напиши явно using. Примерно как если бы конструкторы были explicit по умолчанию.
IT курсы онлайн от лучших специалистов в своей отросли https://deveducation.com/ .