LINUX.ORG.RU

История изменений

Исправление yoghurt, (текущая версия) :

ты просто называешь «безопасностью» совсем другое

В последнее время для меня безопасность больше всего заключается в контроле сайд-эффектов. Пойди заставь ссылку ссылаться на другой объект? То то же.

Всё делать структурами тупо неудобно

Абсолютно так же, как и классами, главное спецификаторы доступа в нужных местах расставить.

Например неудобно, когда у тебя срабатывает operator=() тогда, когда это тебе не нужно.

В большинстве случаев он нужен больше, чем не нужен. Когда он не нужен, его надо закрывать явно как для классов, так и для структур, вручную.

operator=() (...) Или какие-то другие методы. Именно потому, в C++ все методы private.

Я не хочу тебя расстраивать, но по-умолчанию генерируемый компилятором operator= в плюсах - в public. Как и конструктор по-умолчанию, конструктор копирования (если их можно сгенерировать, конечно), и деструктор.

Как ты это приплёл к теме классов и структур в контексте лишних сущностей, я не знаю :)

В этом, и только в этом смысле можно трактовать твою «безопасность»

«Безопасность» тут в том, что ты не сложишь строку с числом, например. Не, ну ты конечно можешь нарисовать соответствующий оператор, но это уже поломает семантику.

Но это только примитивные отголоски той безопасности, которую предоставляют нынче типобезопасные языки вроде хаскеля. Если в типе твоей функции зафиксированы одни сайд-эффекты (может читать из окружения данные типа А, писать данные типа Б), в никаком другом ты её не запустишь - компилятор не даст.

Т.е. если метод принимает ссылку, то в функцию можно передать что угодно, лишь-бы это можно было переделать в ссылку.

Ты ничего не переделываешь в ссылки, ты лишь получаешь ссылки на это «что угодно».

Копию тоже можно, но придётся делать копию.

В метод пойдет только ссылка на эту копию

Можно указатель, но только указатель НА ЭТО.

Указатель в метод, ожидающий ссылку, ты не впихнёшь. И не надо петь про *ptr, это уже не указатель.

Число 22 передать не получится, ибо указатель на константу не имеет смысла. А вот константную ссылку — можно.

22, конечно, константа, вернее литерал. Но не каждая константа - литерал.

Исходная версия yoghurt, :

ты просто называешь «безопасностью» совсем другое

В последнее время для меня безопасность больше всего заключается в контроле сайд-эффектов. Пойди заставь ссылку ссылаться на другой объект? То то же.

Всё делать структурами тупо неудобно

Абсолютно так же, как и классами, главное спецификаторы доступа в нужных местах расставить.

Например неудобно, когда у тебя срабатывает operator=() тогда, когда это тебе не нужно.

В большинстве случаев он нужен больше, чем не нужен. Когда он не нужен, его надо закрывать явно как для классов, так и для структур, вручную.

operator=() (...) Или какие-то другие методы. Именно потому, в C++ все методы private.

Я не хочу тебя расстраивать, но по-умолчанию генерируемый компилятором operator= в плюсах - в private. Как и конструктор по-умолчанию, конструктор копирования (если их можно сгенерировать, конечно), и деструктор.

Как ты это приплёл к теме классов и структур в контексте лишних сущностей, я не знаю :)

Для классов operator= точно так же по умолчанию «дополняется» компилятором, и по-умолчанию он вовсе не private. Шок? Когда его действительно надо запретить, его надо явно объявлять в этой секции как для классов, так и для структур.

В этом, и только в этом смысле можно трактовать твою «безопасность»

«Безопасность» тут в том, что ты не сложишь строку с числом, например. Не, ну ты конечно можешь нарисовать соответствующий оператор, но это уже поломает семантику.

Но это только примитивные отголоски той безопасности, которую предоставляют нынче типобезопасные языки вроде хаскеля. Если в типе твоей функции зафиксированы одни сайд-эффекты (может читать из окружения данные типа А, писать данные типа Б), в никаком другом ты её не запустишь - компилятор не даст.

Т.е. если метод принимает ссылку, то в функцию можно передать что угодно, лишь-бы это можно было переделать в ссылку.

Ты ничего не переделываешь в ссылки, ты лишь получаешь ссылки на это «что угодно».

Копию тоже можно, но придётся делать копию.

В метод пойдет только ссылка на эту копию

Можно указатель, но только указатель НА ЭТО.

Указатель в метод, ожидающий ссылку, ты не впихнёшь. И не надо петь про *ptr, это уже не указатель.

Число 22 передать не получится, ибо указатель на константу не имеет смысла. А вот константную ссылку — можно.

22, конечно, константа, вернее литерал. Но не каждая константа - литерал.