Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections_rus.doc
Скачиваний:
31
Добавлен:
06.02.2016
Размер:
1.41 Mб
Скачать

7.1.1. Преобразования, определяемые классом

Конструктор с одним аргументом автоматически является функцией преобразования из типа аргумента к типу конструируемого класса.Например, для строкового класса определим конструктор:

string::string(const char* s)

{

len = strlen(s);

S = new char[len + 1];

strcpy(S, s);

}

Представленное выражение - автоматическое преобразование типа от char* к string. Оно доступно как явно, так и неявно. Явно оно используется или как операция преобразования, или в приведении, или в функциональной форме. Таким образом, возможны два рабочих варианта кода:

string s;

char str[] = "Hello\n";

s = (string)str; // Выполняет преобразование, а затем присвоение

и

s = str; // Неявный вызов преобразования

Данный код - преобразование из уже определенного типа к типу, определяемому пользователем. Однако возможна обратная ситуация: в примере со строкой может возникнуть необходимость в преобразовании из строки в char*. Это может быть выполнено с помощью определения специальной функции преобразования внутрикласса string следующим образом:

operator char*() { return S; }

Общая форма записи такой функции-члена:

operator тип() { ... }

Такая функция преобразования должна быть функцией-членом без возвращаемого типа и с пустым списком аргументов.Преобразования происходят неявно в выражениях присвоения, при передаче параметров функциям, и в значениях, возвращаемых функциями.

7.1.2. Встроенный строковый тип

Строка символов хранится в памяти как массив и заканчивается нулевым символом, доступ к ней осуществляется с помощью указателя типа char. Указатель указывает на соответствующий строке массив символов. Даже когда мы пишем строковый литерал, например

const char *st=”English\n”;

компилятор помещает все символы строки в массив и затем присваивает переменной st адрес первого элемента массива. Для перебора символов строки используется адресная арифметика, например так:

While (*st++) {…}

St разыменовывается и проверяется на истинность. Любое отличное от нуля значение считается истинным, и, следовательно, цикл заканчивается, когда будет достигнут символ с кодом 0. Стоит отметить, что,так как указатель на строку может иметь нулевое значение (ни на что не указывать), то перед его разыменовыванием (раскрытием) его следует проверять.Эта функция определяет длину строки:

int string_length (const char *st)//st – указатель на строку

{

int length_st=0; // length_st длина строки

if (st) //пока st!= 0

while (*st++) ++length_st; // смещаем указатель, наращиваем длину

return length_st;

}

Строка встроенного типа может быть пустой в двух случаях: если указатель на строку имеет нулевое значение (char *ps1=0;) или указывает на массив, состоящий из одного нулевого символа const char *ps2=””;

Стандартная библиотека предоставляет набор функций для манипуляций со строками (копирование, объединение, поиск подстроки, определение длины строки и т.д.). Для ее использования нужно включать заголовочный файл:

#include <string.h>

Функции:

int strlen(const char*); - возвращает длину строки

int strcmp(const char*, const char*); - сравнивает две строки

char* strcpy(char*, const char*); - копирует одну строку в другую

если в нашу функцию void prnStr() добавить следующий код,

int len=strlen(name.c_str());

int len1=name.length();

cout<<name<<"length="<<len<<"\n";

то получим:

Welcome, string!length=16

Welcome, string!length=16

name: Welcome, string!

cname:Welсome, char!

Работа со строками через указатели или через массивы приемлема, но лучше пользоваться определенным в стандартной библиотеке С++ классомstring.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]