Информация об изменениях

Сообщение Re[8]: Как можно было так протупить с const параметрами? от 22.08.2022 10:31

Изменено 22.08.2022 10:36 vsb

Re[8]: Как можно было так протупить с const параметрами?
Здравствуйте, Marty, Вы писали:

M>>>Не в любом. В твоей джаве все по ссылкам передается, и вот там, да, const имеет некоторый смысл.


vsb>>В жаве нет передачи по ссылке. В жаве исключительно передача по значению. В жаве ссылок в языке вообще нет, только указатели.


M>Ну, ссылка или указатель — не суть, эти различия только в плюсах, где есть между ними различие. Мне почему-то казалось, что в джаве указатели на объекты именуются ссылками, вроде их то так то этак именуют там


Ну я считаю, что ссылка это неизменяемый указатель, что-то вроде alias-а. А так ты прав, именуют по-разному. Хотя судя по тому, что в языке есть NullPointerException, а не NullReferenceException, я лично считаю, что официально их следует называть указателями. С другой стороны арифметики указателей в жаве тоже нет. В общем не суть, но ссылки/указатели жавы на указатели C++ похожи больше, чем на ссылки C++.

>>> Ну и, я не помню, как там в джаве, но если в плюсах передавать указатель на интерфейс, да или просто на объект, то все его вызываемые методы должны быть const, если указатель объявлен как const. Это уже прорастает в интерфейс объекта. Особенно это весело, если это интерфейс, там обычно методы const'ом не обмазывают.


vsb>>В С++ это выглядит как my_class * const mc.


M>Что именно в C++ так выглядит? Что за "это"?


Объявление неизменяемого параметра функции. Ну или объявление неизменяемой переменной (не нравится мне это словосочетание, немасляное масло, но называть это "константой", наверное, тоже не корректно). Т.е. сама переменная mc не изменяема, но при этом можно вызывать неконстантные методы класса my_class.

vsb>>Если я непонятно выражаюсь, под константными параметрами я имею в ввиду исключительно неизменяемость самой переменной. А не тех данных, куда она указывает. Константность тех данных, куда она указывает, это вопрос более сложный. От С этого требовать точно не стоит.


M>Контролировать неизменяемость передаваемой переменной нафик не нужно, так как это вылезает в публичный контракт, которому, по большому счету, должно быть пофиг на то, что делается внутри функции. Было бы полезно, если бы внутри реализации был бы механизм, позволяющий сказать, что все параметры функции — константные, кроме указанных явно.


Не понимаю, почему это вылезает в публичный контракт. Это имеет значение только для реализации функции, меняет она что-то или нет. Если в С++ это не так, это баг.
Re[8]: Как можно было так протупить с const параметрами?
Здравствуйте, Marty, Вы писали:

M>>>Не в любом. В твоей джаве все по ссылкам передается, и вот там, да, const имеет некоторый смысл.


vsb>>В жаве нет передачи по ссылке. В жаве исключительно передача по значению. В жаве ссылок в языке вообще нет, только указатели.


M>Ну, ссылка или указатель — не суть, эти различия только в плюсах, где есть между ними различие. Мне почему-то казалось, что в джаве указатели на объекты именуются ссылками, вроде их то так то этак именуют там


Ну я считаю, что ссылка это неизменяемый указатель, что-то вроде alias-а. А так ты прав, именуют по-разному. Хотя судя по тому, что в языке есть NullPointerException, а не NullReferenceException, я лично считаю, что официально их следует называть указателями. С другой стороны арифметики указателей в жаве тоже нет. В общем не суть, но ссылки/указатели жавы на указатели C++ похожи больше, чем на ссылки C++.

>>> Ну и, я не помню, как там в джаве, но если в плюсах передавать указатель на интерфейс, да или просто на объект, то все его вызываемые методы должны быть const, если указатель объявлен как const. Это уже прорастает в интерфейс объекта. Особенно это весело, если это интерфейс, там обычно методы const'ом не обмазывают.


vsb>>В С++ это выглядит как my_class * const mc.


M>Что именно в C++ так выглядит? Что за "это"?


Объявление неизменяемого параметра функции. Ну или объявление неизменяемой переменной (не нравится мне это словосочетание, немасляное масло, но называть это "константой", наверное, тоже не корректно). Т.е. сама переменная mc не изменяема, но при этом можно вызывать неконстантные методы класса my_class.

vsb>>Если я непонятно выражаюсь, под константными параметрами я имею в ввиду исключительно неизменяемость самой переменной. А не тех данных, куда она указывает. Константность тех данных, куда она указывает, это вопрос более сложный. От С этого требовать точно не стоит.


M>Контролировать неизменяемость передаваемой переменной нафик не нужно, так как это вылезает в публичный контракт, которому, по большому счету, должно быть пофиг на то, что делается внутри функции. Было бы полезно, если бы внутри реализации был бы механизм, позволяющий сказать, что все параметры функции — константные, кроме указанных явно.


Не понимаю, почему это вылезает в публичный контракт. Это имеет значение только для реализации функции, меняет она что-то или нет. Если в С++ это не так, это баг.

Но вообще, похоже, что ты не прав. Такая программка в онлайн-компиляторе никаких предупреждений не выдаёт.


class my_class {
};

void print_my_class(my_class *mc);

int main()
{
    print_my_class(0);

    return 0;
}

void print_my_class(my_class * const mc) {
}