Комментарии 11
Вот черт, а я уже и забыл, что можно and, or и прочие использовать.
+1
Вот интересно, почему операторы (кроме operator=() ) можно объявлять (и определять) вне классов, а методы нельзя?
+1
Объявление оператора вне класса позволяет использовать встроенный тип в качестве левого операнда:
А вообще Страуструп предлагает это же и для методов сделать (если они принимают объект первым аргументом), хотя лично мне эта идея не сильно нравится после непонятных ошибок компиляции C# кода, которому просто не хватало импорта, т.е. семантика тут слишком неявная получается.
class C { };
int operator+(int a, const C &c) { return 0; }
Это также позволяет выполнять неявные преобразования левого операнда. Скажем иначе это бы не работало:std::string s;
"something" + s;
А вообще Страуструп предлагает это же и для методов сделать (если они принимают объект первым аргументом), хотя лично мне эта идея не сильно нравится после непонятных ошибок компиляции C# кода, которому просто не хватало импорта, т.е. семантика тут слишком неявная получается.
0
Зато, можно будет расширять существующие классы non-intrusive. Скажем, добавить к std::string метод .toBase64() или что-то вроде того.
0
Это да, хорошее в этом есть, я больше боюсь злоупотреблений. При виде
std::string("something").toupper()
хочется пойти и посмотреть, когда это добавили toupper
для std::string
, а потом сидеть удивляться, почему его в документации нет, а код работает, найти где же он действительно объявлен тоже будет не очень просто.+1
В современных IDE решается через Ctrl+click. Сразу становится видно, где объявлена эта функция.
0
Даже в IDE оно не всегда правильно работает и не всегда проект можно настроить так, чтобы работало. На огромных проектах под кучи платформ, где это действительно нужно, оно обычно и работает хуже всего (показывает не для той целевой платформы, например; плюс не всегда быстро). И в целом не хотелось бы завязывать язык на работу в IDE.
+2
ALGOL 68 видимо крутая штука была
+1
Выделение памяти в куче через конструкторы почему то напомнило Delphi.
Хорошо, что сейчас объекты классов могут располагаться и в стеке, по сравнению с тем же C#.
Хорошо, что сейчас объекты классов могут располагаться и в стеке, по сравнению с тем же C#.
+1
Спасибо за статью. Узнал много нового о своём любимом языке программирования.
А вот это можно отнести к «священным войнам».
Изначально, дружественными (friend) могли быть только классы. Общей идеей концепции является помещение ряда сущностей в один домен безопасности, члены которого равны между собой в правах (а не нарушение инкапсуляции, как многие считают).
А вот это можно отнести к «священным войнам».
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Дизайн и эволюция языка С++: выдержки