#c #string #std #stdstring
#c #строка #std #stdstring
Вопрос:
Я не думаю, что кто-нибудь скажет мне, в чем разница между использованием std::string и просто строкового типа данных в C ??
В какой ситуации std::string следует использовать поверх стандартной строки??
Спасибо.
Комментарии:
1. какой стандартный строковый тип данных? вы говорите о
char *
?2. Я имею в виду строку саму по себе. Например, когда я объявляю переменную «строковое имя»… Если это имеет какой-то смысл ?? : S
Ответ №1:
Они оба одного и того же типа. std::string
определяет пространство имен, в то время string
как имеет смысл только в том случае, если using namespace std;
using std::string
используется оператор or . Так что не имеет никакого значения, что вы используете (если вы последовательны).
Если вы говорите о строковых литералах (таких как "hello"
), то они имеют тип const char []
, который неявно распадается на a const char *
. std::string
имеет explicit
неконструктор, который принимает a const char *
, что позволяет неявное преобразование из const char *
в std::string
. С помощью метода можно выполнить противоположную операцию std::string::c_str()
.
Если вы ищете причину для использования std::string
вместо const char *
, то, я думаю, мой ответ будет «столько, сколько сможете».
Комментарии:
1. Технически строковый литерал
"hello"
имеет типconst char[6]
.
Ответ №2:
Вероятно, это одно и то же в вашей программе. «Стандартная» строка находится в пространстве имен «std». Если вы «используете std::string;» или «используете пространство имен std;» в модуле, то они эквивалентны. Если вы не указываете оператор «using», то вам необходимо указать пространство имен объекта. Предпочтительнее не предоставлять инструкции «using» в файле заголовка, и поэтому вы обычно увидите разрешение / спецификаторы пространства имен для объектов. (т.е. std::vector, mynamespace::myclass и т. Д.). Использование «using» чаще встречается в файлах реализации, где они не будут влиять на другие файлы, как если бы они были указаны в заголовочном файле.
Можно использовать объект string от другого поставщика. В этом случае поставщик будет / должен иметь свою реализацию строкового объекта в своем собственном пространстве имен, и вам нужно будет объявить, какой строковый объект вы использовали.
Итак:
File: stdString.cpp
-------------
#include <string>
#include "providerx/string.h"
using namespace std;
void foo()
{
string x; // Using string object provided by the C standard library
std::string y; // Again, using C standard lib string
providerx::string // Using string object defined within the providerx namespace
}
File: providerString.cpp
-------------------
#include "providerx/string.h"
using providerX::string;
void foo()
{
string x; // Using providerx string object
}
Комментарии:
1. Мне нравится объяснение того, когда каждая форма может быть подходящей!
Ответ №3:
Скорее всего, у вас есть using namespace std
где-то в вашем коде. Это позволяет вам получать доступ к членам пространства имен std без разрешения области видимости. Поэтому…
std::string == строка