C std::строка и строка

#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 == строка