char* name = "name"
должен быть недействительным, но компилируется в большинстве систем для обратной совместимости со старыми днями, когда не было const, и что он сломал бы большие объемы унаследованного кода, если бы он не компилировался.Хотя обычно появляется предупреждение.
Опасность заключается в том, что вы получаете указатель на доступные для записи данные (доступные для записи в соответствии с правилами C ++), но если вы действительно пытаетесь записать их, вы вызываете Undefined Behavior и языкправила должны пытаться защитить вас от этого настолько, насколько это возможно.
Правильная конструкция -
const char * name = "name";
С вышесказанным все в порядке, даже в C ++.Использование строки не всегда более корректно.
Ваше второе утверждение должно быть действительно
std::string name = "name";
string - это класс (на самом деле typedef из basic_string<char,char_traits<char>,allocator<char>
), определенный в стандартной библиотеке, следовательно, в пространстве именstd (как basic_string, char_traits и allocator)
Существуют различные сценарии, в которых использование строки намного предпочтительнее использования массивов char.Например, в вашем непосредственном случае вы МОЖЕТЕ изменить его.Так что
name[0] = 'N';
(преобразовать первую букву в верхний регистр) допустимо для строки, а не для char * (неопределенное поведение) или const char * (не компилируется).Вам будет разрешено изменить строку, если у вас будет char name[] = "name";
Однако, если вы хотите добавить символ в строку, конструкция std :: string является единственной, которая позволит вам сделать это чисто.Со старым C API вам пришлось бы использовать strcat (), но это было бы недопустимо, если бы вы не выделили достаточно памяти для этого.
std :: string управляет памятью, поэтому вам не нужновызовите malloc () и т. д. Фактически allocator, третий параметр шаблона, управляет памятью под ним - basic_string делает запросы о том, сколько памяти ему нужно, но не связан с используемой техникой фактического выделения памяти, поэтому вы можете использовать пулы памяти и т. д. дляэффективность даже при использовании std :: string.
Кроме того, basic_string фактически не выполняет многие строковые операции, которые выполняются вместо этого через char_traits.(Это позволяет использовать специальные C-функции, которые хорошо оптимизированы).
std :: string, следовательно, является лучшим способом управления строками, когда вы обрабатываете динамические строки, созданные и передаваемые во время выполнения.(а не просто литералы).
Вы редко будете использовать строку * (указатель на строку).Если вы сделаете это, это будет указатель на объект, как и любой другой указатель.Вы не сможете распределить его так, как вы.