Как стать автором
Обновить

Комментарии 11

Вот интересно, почему операторы (кроме operator=() ) можно объявлять (и определять) вне классов, а методы нельзя?
Объявление оператора вне класса позволяет использовать встроенный тип в качестве левого операнда:
class C { };

int operator+(int a, const C &c) { return 0; }
Это также позволяет выполнять неявные преобразования левого операнда. Скажем иначе это бы не работало:
std::string s;
"something" + s;

А вообще Страуструп предлагает это же и для методов сделать (если они принимают объект первым аргументом), хотя лично мне эта идея не сильно нравится после непонятных ошибок компиляции C# кода, которому просто не хватало импорта, т.е. семантика тут слишком неявная получается.
Зато, можно будет расширять существующие классы non-intrusive. Скажем, добавить к std::string метод .toBase64() или что-то вроде того.
Это да, хорошее в этом есть, я больше боюсь злоупотреблений. При виде std::string("something").toupper() хочется пойти и посмотреть, когда это добавили toupper для std::string, а потом сидеть удивляться, почему его в документации нет, а код работает, найти где же он действительно объявлен тоже будет не очень просто.
В современных IDE решается через Ctrl+click. Сразу становится видно, где объявлена эта функция.
Даже в IDE оно не всегда правильно работает и не всегда проект можно настроить так, чтобы работало. На огромных проектах под кучи платформ, где это действительно нужно, оно обычно и работает хуже всего (показывает не для той целевой платформы, например; плюс не всегда быстро). И в целом не хотелось бы завязывать язык на работу в IDE.
ALGOL 68 видимо крутая штука была
Выделение памяти в куче через конструкторы почему то напомнило Delphi.
Хорошо, что сейчас объекты классов могут располагаться и в стеке, по сравнению с тем же C#.
Спасибо за статью. Узнал много нового о своём любимом языке программирования.

Изначально, дружественными (friend) могли быть только классы. Общей идеей концепции является помещение ряда сущностей в один домен безопасности, члены которого равны между собой в правах (а не нарушение инкапсуляции, как многие считают).

А вот это можно отнести к «священным войнам».
Спасибо за замечание, подправил формулировку на менее «холиварную».
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории