символ константы * как параметр функции в C++

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

я должен попробовать XKeyMacs....

6
задан Loai Nagati 30 October 2009 в 20:37
поделиться

7 ответов

Попробую проще выразить то, что говорят другие:

Функция someFunction принимает строку только для чтения (хотя для простоты ] char * может использоваться во многих других случаях). Независимо от того, передаете ли вы строку только для чтения в someFunction или нет, параметр обрабатывается как доступный только для чтения кодом, выполняющимся в контексте этой функции. Таким образом, внутри этой функции компилятор попытается предотвратить запись в эту строку в максимально возможной степени. Неконстантный указатель - это такая попытка игнорировать тег только для чтения для строки и компилятора, справедливо и громко информирует вас о таком игнорировании системы типов;)

В чем разница между: int someFunction (const char * sm) const {...} и это: int someFunction (const char * sm) {... }

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

11
ответ дан 8 December 2019 в 03:53
поделиться

Это не совсем ясно из вашего вопроса, и я подозреваю, что текст ошибки, который вы даете, на самом деле неверен и фактически гласит:

не может преобразовать из const char * в char *

Поскольку вы говорите, что

someMemberVar - это просто указатель на char.

Это имеет смысл. Имейте в виду, что const char * на самом деле то же самое, что char const * - то есть это указатель на const char, а не константный указатель на char! И вы не можете преобразовать указатель на T const в указатель на T , потому что это нарушает безопасность типов. Рассмотрим:

const char* a = "abc";
char* b = a; // what you're trying to do
b[0] = 'x';  // if you could do it, you could change const data without casts
10
ответ дан 8 December 2019 в 03:53
поделиться

Если вы передадите неконстантный указатель в someFunction , он автоматически преобразуется в константный указатель. Так что вы можете' t присвоить sm someMemberVar , потому что это нарушит постоянство sm. Вы можете объявить someMemberVar как const char * , и ваш код будет работать, однако вы не сможете изменить то, на что он указывает.

1
ответ дан 8 December 2019 в 03:53
поделиться

const char * - указатель на постоянный char:


const char* ptr0; // ptr0 is mutable, *ptr0 is const
char* const ptr1; // ptr1 is const, *ptr1 is mutable
4
ответ дан 8 December 2019 в 03:53
поделиться

В комментарии к одному из других ответов вы сказали:

const char * sm означает, что я могу передать const или неконстантный, так почему C ++ конвертирует его автоматически? Который для меня не имеет смысла.

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

Вы правы, что неконстантный char * можно безопасно преобразовать в const char * . Однако ваш метод явно принимает const char * . Таким образом, хотя вы можете передать в функцию char * , компилятор просто автоматически приводит аргумент при вызове функции. Фактический код функции не знает, был ли исходный аргумент константой или нет. Компилятор должен использовать фактическое объявление переменной, которую вы используете, , а не какой-то предыдущей переменной, которая имела такое же значение.

1
ответ дан 8 December 2019 в 03:53
поделиться

const char * sm - указатель на постоянный символ (или массив). Когда вы пытаетесь назначить someMemberVar указатель на char, вы пытаетесь указать ему на набор константных символов. Это причина ошибки.

0
ответ дан 8 December 2019 в 03:53
поделиться

В вашем примере sm - это const char *, поэтому someFunction имеет договор со своим вызывающим абонентом, что он не будет изменять память, на которую указывает sm.

Но если вы назначите sm для someMemberVar и someMemberVar не является const char *, тогда вы сможете изменить память, на которую указывает sm, через someMemberVar, а компилятор не позволит вам это сделать.

0
ответ дан 8 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

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