Понимание функции strlen - Назначение const char * s для const char * sc

Твердые советы от Джошуа Блоха (Эффективная Java, 2-е изд.):

"только выбирают в качестве аргументов для перегруженного метода те, которые имеют -радиционно разные типы."

Объект с радикально отличающимся типом - это тот, который нельзя разумно отличить от другого типа аргументов. Следуя этому правилу, вы можете сэкономить часы отладки таинственной ошибки, которая может произойти, когда компилятор во время компиляции выбирает перегрузку метода, которую вы не ожидали.

Ваши строки кода нарушают это правило и открывают дверь для ошибок:

public TestOverload(int i){System.out.println("Int");}
public TestOverload(char... c){System.out.println("char");}

A char является взаимозависимым с int, поэтому единственный способ предсказать, что произойдет с вызовами, - это перейти к Спецификации языка Java и прочитать несколько тайные правила о том, как разрешаются перегрузки.

К счастью, эта ситуация не должна нуждаться в исследовании JLS. Если у вас есть аргументы, которые не сильно отличаются друг от друга, возможно, лучшим вариантом является , а не перегрузка . Дайте методам разные имена, чтобы не было возможности для ошибки или путаницы со стороны любого, кому может понадобиться поддерживать код.

Время - деньги.

4
задан Keith Thompson 16 January 2019 в 00:42
поделиться

3 ответа

Вы правы.

const char * sc объявляет указатель на const char. По сути, это означает, что sc указывает на переменную типа char (или в этом случае непрерывный массив char с) и , который нельзя использовать sc для изменения указанной переменной , Смотрите его в прямом эфире здесь .

Обратите внимание, что само sc не является , а не переменной const. const применяется к указанной переменной, а не к указателю. Таким образом, вы можете изменить значение указателя , то есть переменную, на которую он указывает.

Следуйте этому ответу, чтобы лучше понять различные варианты использования const и указателей: Чем отличаются const int *, const int * const и int const *?

0
ответ дан Louen 16 January 2019 в 00:42
поделиться

Я думаю, что вы спрашиваете, что означает ключевое слово const . Если нет, пожалуйста, уточните свой вопрос.

Мне нравится думать, что любая переменная const может храниться в ПЗУ (постоянная память), а переменные, которые не объявлены как const, могут храниться в ОЗУ (оперативное запоминающее устройство). Этот тип зависит от типа компьютера, с которым вы работаете, поэтому данные const на самом деле могут не храниться в ПЗУ, но это может быть так.

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

Это означает, что вы можете ссылаться на указатель и передавать его столько раз, сколько захотите. Также вы можете назначить другое значение указателю.

Скажем, у вас есть этот код

const char* foo = "hello";
const char* bar = "world";

Это совершенно законно делать

foo = bar;

Теперь обе точки указывают «мир»

Это также законно делать [1111 ]

const char *myPtr = bar;
myPtr = foo;

То, что вам не разрешено делать, это изменять фактическую память данных, чтобы вам было запрещено это делать

foo[0] = 'J';
0
ответ дан Marc 16 January 2019 в 00:42
поделиться

Правильно ли мое понимание законности sc = s?

Да, только некоторые детали последней части нужны.

... но любое присвоение (или ссылка?) на *s или sc было бы незаконным.

(я подозреваю, что OP означает «... или *sc было бы незаконно.»)

Ссылка на то, на что указывает s или sc, в порядке, как в char ch = *sc;

Попытка изменить значение *s или *sc представляет собой неопределенное поведение (UB), а не «недопустимо», как в *sc = 'x';
(См. хорошую дополнительную информацию по @rici )

С UB назначение может работать, оно может не работать по вторникам, код может аварийно завершиться и т. Д. C не определяет, что происходит. Код достоверности не должен пытаться это сделать.

0
ответ дан chux 16 January 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: