В некоторых вызовах функций я вижу подобные вещи.
function(variable1, "someValue");
У меня есть несколько вопросов, основанных на этом
1) Как с ++ относится ко второму аргументу?
2) если какая-то функция принимает cstring, то почему мы получаем ошибку, когда делаем следующее
functionTakingCString(stringVariable.c_str() + "someValue");
Есть ли какой-нибудь способ вместо объявления переменной const char? Пожалуйста, поправьте меня, если я ошибаюсь где-то.
Они называются строковые литералы и если вы хотите принять аргумент, который является строковым литералом, как это вы обычно передаете const std::string&
или const char*
в зависимости от того, что требует ваш API.
2) если какая-то функция принимает cstring, то почему мы получаем ошибку, когда делаем следующее
Это потому, что оператор «+» не перегружен для char *
тип. Вы можете объединить это с stringVariable
типа string
для которого +
оператор был перегружен, чтобы объединить две строки, а затем получить c_str()
перейти к функции, принимающей char *
или же const char *
,
const char *
Бинарный оператор +
не может быть применен к const char*
типы операндов. Если он является std :: string, то он работает из-за перегрузки операторов.
Второй аргумент — const char *. В некоторых случаях вы можете конвертировать из одного типа в другой, если у вас есть специальный конвертирующий конструктор желаемого типа, который принимает данный тип. Компилятор может сделать это за вас в некоторых случаях.
В этом примере строка имеет конструктор, который принимает const char *, поэтому компилятор может превратить const char * в строку для вас под прикрытием. Если вы хотите прекратить такое поведение, загляните в явное ключевое слово.
Тип char * на самом деле не является классом, поэтому у него нет оператора +, который работает со строками. Тем не мение,
(stringVariable + "someValue").c_str()
будет работать, потому что stringVariable является строкой и оператор плюс может заключить в строку символ char *.