=> Главная База Знаний Qt Символьные строки


Символьные строки

Символьные строки

Основной способ представления символьных строк в С++ заключается в применении массива символов char, завершаемого нулевым байтом ('\0'). Следующие четыре функции демонстрируют работу таких строк:

01 void hello1()

02 {

03 const char str[] = {

04 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r' 'l', 'd', '\0'

05 };

06 cout << str << endl;

07 }

08 void hello2()

09 {

10 const char str[] = "Hello world!";

11 cout << str << endl;

12 }

13 void hello3()

14 {

15 cout << "Hello world!" << endl;

16 }

17 void hello4()

18 {

19 const char *str = "Hello world!";

20 cout << str << endl;

21 }

В первой функции строка объявляется как массив и инициализируется посимвольно. Обратите внимание на символ в конце '\0', обозначающий конец строки. Вторая функция имеет аналогичное определение массива, но на этот раз для инициализации массива используется строковый литерал. В С++ строковые литералы — это просто массивы символов const char, завершающиеся символом '\0', который не указывается в литерале. В третьей функции строковый литерал используется непосредственно без придания ему имени. После перевода на инструкции машинного языка она будет идентична первым двум функциям.

Четвертая функция немного отличается, поскольку создает не только массив (без имени), но и переменную—указатель с именем str, в которой хранится адрес первого элемента массива. Несмотря на это, семантика данной функции идентична семантике предыдущих трех функций, и оптимизирующий компилятор удалит лишнюю переменную str.

Функции, принимающие в качестве аргументов строки С++, обычно объявляют их как char * или const char *. Ниже приводится короткая программа, иллюстрирующая оба подхода:

01 #include <cctype>

02 #include <iostream>

03 using namespace std;

04 void makeUppercase(char *str)

05 {

06 for (int i = 0; str[i] != '\0'; ++i)

07 str[i] = toupper(str[i]);

08 }

09 void writeLine(const char *str)

10 {

11 cout << str << endl;

12 }

13 int main(int argc, char *argv[])

14 {

15 for (int i = 1; i < argc; ++i) {

16 makeUppercase(argv[i]);

17 writeLine(argv[i]);

18 }

19 return 0;

20 }

В С++ тип char обычно занимает 8 бит. Это значит, что в массиве символов char легко можно хранить строки в кодировке ASCII, ISO 8859-1 (Latin-1) и в других 8-битовых кодировках, но нельзя хранить произвольные символы Unicode, если не прибегать к многобайтовым последовательностям. Qt предоставляет мощный класс QString, который хранит строки Unicode в виде последовательностей 16-битовых символов QChar и при их реализации использует оптимизацию неявного совмещения данных («копирование при записи»). Более подробно строки QString рассматриваются в главе 11 («Классы—контейнеры») и в главе 17 («Интернационализация»).