Чего мне не хватает в C++ · Заметки

Чего мне сильно не хватает в C++. Точнее, чего наболело за последние дни, при копании большого чужого кода.

·· [Continuing] ··

1. Ключевого слова override. Модификатор функции-члена класса, обозначает, что данная функция переопределяет функцию класса предка. Компилятор проверяет, что функция с данной сигнатурой действительно есть у предка. Капитально бы облегчило чтение кода и рефакторинг: не было бы опасности поменять сигнатуру у предка и разрушить переопределение. Программер напартачил в куче мест, передавая по значению объекты, которые бы следовало передавать по ссылке, и принципиально не использовал const, при рефакторинге всё это исправляется и приходится мучительно вычитывать в результатах поиска все определения функций, дабы чего не попортилось. Хорошо ещё, что код используется пока что только в одном проекте.
2. Ключевого слова overload. Сообщает, что есть несколько функций с таким именем и разной сигнатурой. Для тех же целей.
3. Ключевого слова final. Запрет на наследование от класса или дальнейшего переопределения функции.
4. Запрета на скрытие функций при наследовании. Например:
class A{
    void fn();
};
class B: public A {
    void fn( int ); // Скрывает A::fn() - хорошо бы это порождало не warning, а ошибку.
};

5. Обязательное повторение virtual при перегрузке виртуальных функций. Например:
class A{
    virtual void fn();
};
class B: public A {
    // Полагаем, что пожелание насчёт override уже выполнено ;-)
    override void fn(); // Нельзя!!! Надо так: override virtual void fn().
};

Это просто сильно облегчило бы читабельность. Сам я всегда пишу virtual при перегрузке.
6. Жёсткий запрет на невиртуальные деструкторы у классов с виртуальными членами.
7. Запрет на виртуальные функции у struct и невозможность наследовать struct от class. В противном случае (как есть сейчас) даже непонятно, нафига в языке два ключевых слова с практически одинаковым смыслом. Лично я понимаю struct как "низкоуровневую" структуру, которая никогда не содержит скрытых полей (типа указателя на VMT) и прочих "подлостей", имеет однозначное представление в памяти (все поля последовательно, кстати, хорошо бы обозначить, что по умолчанию поля не выравниваются по адресам) и позволяет работать с собой через memset(), memcpy(), memmove(), fread(), fwrite() и т.д. Было бы здорово, если бы это было зафиксировано в стандартах языка и компиляторах
Жаль, что хотя C++ и эволюционирует, но подобных вещей ждать не приходится - иначе, порушится совместимость со старым кодом. А вот более молодые языки имеют эти ключевые слова. Чем и хвастаются вполне заслуженно.




Comments:

No Comments for this post yet...

Leave a comment:

Your email address will not be displayed on this site.
Your URL will not be displayed on this site. Comments containing URL's of non-personal pages may be removed.
Confirmation Code:
Human Confirmation Code (Captcha)

HTML tags and "<", ">" symbols are not allowed. Links will not be converted to hyperlinks. Any commercials are removed and reported as abuse.

Archives

                                                                                                                                                                                                                                                                   


© Sergey A. Galin, 1998-2021 sageshome.net/blog/