Почему нам не нужны объекты для хранения строковых данных? - PullRequest
3 голосов
/ 12 апреля 2019

В C ++, если строка является классом, почему нам не нужен оператор точки или объект для хранения данных в строке?

Классическая струна:

string str = "ABC";

Почему мы можем напрямую передавать ABC, используя "" вместо того, чтобы делать это как

string str;

str.data = "ABC";

Но нам нужно использовать объекты для доступа к функциям. Пример:

str.length();

Почему мы это делаем?

Является ли строка каким-то особенным видом класса?

Ответы [ 3 ]

2 голосов
/ 12 апреля 2019

std :: basic_string имеет такой конструктор:

basic_string( const CharT* s, const Allocator& alloc = Allocator() );

Создает строку с содержимым, инициализированным копией строки символов с нулевым символом в конце, указывающей напо s.

Но важно отметить, что этот конструктор не explicit, поэтому компилятор может выполнять неявное преобразование строки символов с нулевым символом в конце во время вызова конструктора.

Например, следующий код компилируется без проблем:

class Foo {
public:
    Foo(int) {}
};

int main() {
    Foo f = 10;
}

Он не скомпилируется, если конструктор записан в виде:

explicit Foo(int) {}

2 голосов
/ 12 апреля 2019

string str = "ABC"; не является назначением. Это строительство. В частности, он вызывает конструктор std::string, принимающий аргумент const char *.

Это то же , что и

string str("ABC");

просто другой синтаксис.

Назначение также работает. Вы делаете это:

string str;
str = "ABC";

Смотри также:

Копировать инициализацию

std :: строковые конструкторы

станд :: basic_string :: оператор =

0 голосов
/ 12 апреля 2019

В C ++ строковый литерал - это не std::string, а массив символов стиля C (char[N]).И да std::string или любой другой сторонний тип строки, который вы можете увидеть, является классом с конвертирующим конструктором, принимающим символьные массивы в качестве входных данных.Точнее, std::string - это псевдоним типа для экземпляра шаблона std::basic_string.Одним словом, прежде чем вы сможете что-либо сделать со строковым литералом, вам лучше преобразовать его в строку:

std::string{"ABC"}.size()

Или вам придется переключиться на C API, который не рекомендуется для начинающих:

strlen( "ABC")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...