История изменений
Исправление yoghurt, (текущая версия) :
ты просто называешь «безопасностью» совсем другое
В последнее время для меня безопасность больше всего заключается в контроле сайд-эффектов. Пойди заставь ссылку ссылаться на другой объект? То то же.
Всё делать структурами тупо неудобно
Абсолютно так же, как и классами, главное спецификаторы доступа в нужных местах расставить.
Например неудобно, когда у тебя срабатывает operator=() тогда, когда это тебе не нужно.
В большинстве случаев он нужен больше, чем не нужен. Когда он не нужен, его надо закрывать явно как для классов, так и для структур, вручную.
operator=() (...) Или какие-то другие методы. Именно потому, в C++ все методы private.
Я не хочу тебя расстраивать, но по-умолчанию генерируемый компилятором operator= в плюсах - в public. Как и конструктор по-умолчанию, конструктор копирования (если их можно сгенерировать, конечно), и деструктор.
Как ты это приплёл к теме классов и структур в контексте лишних сущностей, я не знаю :)
В этом, и только в этом смысле можно трактовать твою «безопасность»
«Безопасность» тут в том, что ты не сложишь строку с числом, например. Не, ну ты конечно можешь нарисовать соответствующий оператор, но это уже поломает семантику.
Но это только примитивные отголоски той безопасности, которую предоставляют нынче типобезопасные языки вроде хаскеля. Если в типе твоей функции зафиксированы одни сайд-эффекты (может читать из окружения данные типа А, писать данные типа Б), в никаком другом ты её не запустишь - компилятор не даст.
Т.е. если метод принимает ссылку, то в функцию можно передать что угодно, лишь-бы это можно было переделать в ссылку.
Ты ничего не переделываешь в ссылки, ты лишь получаешь ссылки на это «что угодно».
Копию тоже можно, но придётся делать копию.
В метод пойдет только ссылка на эту копию
Можно указатель, но только указатель НА ЭТО.
Указатель в метод, ожидающий ссылку, ты не впихнёшь. И не надо петь про *ptr
, это уже не указатель.
Число 22 передать не получится, ибо указатель на константу не имеет смысла. А вот константную ссылку — можно.
22, конечно, константа, вернее литерал. Но не каждая константа - литерал.
Исходная версия yoghurt, :
ты просто называешь «безопасностью» совсем другое
В последнее время для меня безопасность больше всего заключается в контроле сайд-эффектов. Пойди заставь ссылку ссылаться на другой объект? То то же.
Всё делать структурами тупо неудобно
Абсолютно так же, как и классами, главное спецификаторы доступа в нужных местах расставить.
Например неудобно, когда у тебя срабатывает operator=() тогда, когда это тебе не нужно.
В большинстве случаев он нужен больше, чем не нужен. Когда он не нужен, его надо закрывать явно как для классов, так и для структур, вручную.
operator=() (...) Или какие-то другие методы. Именно потому, в C++ все методы private.
Я не хочу тебя расстраивать, но по-умолчанию генерируемый компилятором operator= в плюсах - в private. Как и конструктор по-умолчанию, конструктор копирования (если их можно сгенерировать, конечно), и деструктор.
Как ты это приплёл к теме классов и структур в контексте лишних сущностей, я не знаю :)
Для классов operator= точно так же по умолчанию «дополняется» компилятором, и по-умолчанию он вовсе не private. Шок? Когда его действительно надо запретить, его надо явно объявлять в этой секции как для классов, так и для структур.
В этом, и только в этом смысле можно трактовать твою «безопасность»
«Безопасность» тут в том, что ты не сложишь строку с числом, например. Не, ну ты конечно можешь нарисовать соответствующий оператор, но это уже поломает семантику.
Но это только примитивные отголоски той безопасности, которую предоставляют нынче типобезопасные языки вроде хаскеля. Если в типе твоей функции зафиксированы одни сайд-эффекты (может читать из окружения данные типа А, писать данные типа Б), в никаком другом ты её не запустишь - компилятор не даст.
Т.е. если метод принимает ссылку, то в функцию можно передать что угодно, лишь-бы это можно было переделать в ссылку.
Ты ничего не переделываешь в ссылки, ты лишь получаешь ссылки на это «что угодно».
Копию тоже можно, но придётся делать копию.
В метод пойдет только ссылка на эту копию
Можно указатель, но только указатель НА ЭТО.
Указатель в метод, ожидающий ссылку, ты не впихнёшь. И не надо петь про *ptr
, это уже не указатель.
Число 22 передать не получится, ибо указатель на константу не имеет смысла. А вот константную ссылку — можно.
22, конечно, константа, вернее литерал. Но не каждая константа - литерал.