std::string test("this is a test string");
test[0] = 'b';
Как и код выше, часть строки была изменена, будет ли компилятор сгенерировать новую строку или выполнить модификацию на старой?Является ли класс строки C++ только для чтения?
std::string test("this is a test string");
test[0] = 'b';
Как и код выше, часть строки была изменена, будет ли компилятор сгенерировать новую строку или выполнить модификацию на старой?Является ли класс строки C++ только для чтения?
test[0]
вернет неконстантный (поскольку строковый объект не является константой) ссылка на первый символ, который будет успешно заменен на символ b
.
Посмотрите reference.
Вы будете изменять существующие string
.
В соответствии с documentation оператор [] вернет ссылку на символ по этому индексу.
Если строковый объект имеет значение const, функция возвращает const char &. В противном случае он возвращает char &.
Если строка является константой, вы не сможете изменить его, иначе вы будете иметь возможность изменить исходную строку
Нет, вы изменяете старый. Если вы хотите строковый объект только для чтения, вам нужно сопзИте
std::string const test("this is a test string");
test[0] = 'b'; // compile error.
Конструктор string
будет копировать массив символов. Вторая строка изменит эту копию.
На самом деле нет строки, которую может копировать конструктор; он скопирует * character array * во вновь созданную строку. – celtschk
Я рассматриваю массив 'char' как строку C-стиля. Но, я все равно изменю текст. –
test
std::string
станет «bhis - тестовая строка», так как вы можете его изменить. Строковый литерал "this is a test string"
, используемый для построения строки, не изменится.
C++ std
строки mutable
, и они являются изменяемыми. В этом случае строка будет подвергаться модификации вместо создания экземпляра нового строкового объекта.
Следует отметить, что объявление объекта как 'const' не делает его по-настоящему доступным для чтения, поскольку вы указываете его, поскольку константа может быть отброшена. – Kolyunya
@ Kolyunya, но это было бы неопределенным поведением для выполнения любых неконстантных операций над ним. – juanchopanza
@juanchopanza спасибо за информацию, я этого не знал! '7.1.5.1/4: За исключением того, что любой член класса, объявленный mutable (7.1.1), может быть изменен, любая попытка изменить объект const в течение его жизненного цикла (3.8) приводит к неопределенному поведению.' – Kolyunya